我有一个AsyncTask,我想存储一些信息 这个类的领域。我有这样的事情:
public class NFCReaderTask extends AsyncTask<Void, Void, Void> {
private String Year = null;
private String Month = null;
private String Day = null;
@Override
protected void onPreExecute() {
// do some stuff
}
@Override
protected Void doInBackground(Void... params) {
// do some stuff
}
@Override
protected void onPostExecute(final Void unused) {
// do some stuff
// here my fields are filled with all informations
log.v("This First", "" + getYear());
}
public String getYear() {
return Year;
}
public String getMonth() {
return Month;
}
public String getDay() {
return Day;
}
}
在我的活动中,我这样做:
public void resolveIntent(Intent intent) {
// ...
NFCReaderTask startReaderTask = new NFCReaderTask(dataDevice);
startReaderTask.execute();
startReaderTask.get();
log.v("This Second", "" + startReaderTask.getYear()); // but this is printed out first
// ...
}
但是这些值都是空的。为什么我的字段充满了信息 在我的onPostExecute方法的最后几行,但在.execute()之后为null AsyncTask?
编辑:
我添加了一些日志输出并注意到,我的活动中的日志输出 在我的AsyncTask的日志输出之前打印出来。这是什么意思 AsyncTask#get()不起作用?
答案 0 :(得分:0)
它们是null,因为至少在提供的代码中,您永远不会提供它们的值。您需要使用setter方法设置执行前的年,月和日的值,或者您需要在execute()方法中提供数据作为参数并检索参数。例如:
@Override
protected Void doInBackground(String...params){
String year = params[0];
String month = params[1];
String day = params[2];
}
如果您的问题是您没有从AsyncTask
返回值,那是因为AsyncTask
不会像普通方法那样返回值。作为一般规则,您不应使用get()方法来获取值。而是在AsyncTask
中定义一个接口,并使用它来回调您的起始活动或片段与结果。例如:
public interface ReaderTaskCallback{
public void onTaskComplete(String year, String month, String day);
}
通过添加setCallback方法
创建AsyncTask
时设置界面
//In your AsyncTask
private ReaderTaskCallback mCallback;
public void setCallback(ReaderTaskCallback callback){
mCallback = callback;
}
//In your activity
NFCReaderTask startReaderTask = new NFCReaderTask(dataDevice);
startReaderTask.setCallback(new ReaderTaskCallback(){
@Override
public void onTaskComplete(String year, String month, String day){
//use results
}
});
要从任务中取回结果,只需在完成任务时调用回调方法:
mCallback.onTaskComplete(year, month, day);
值准备好后,会将值传递回您的活动或片段。
答案 1 :(得分:0)
您没有从任何地方传递任何日期参数,如果您这样做了,那么您还需要在NFCReaderTask类中添加构造函数...
public NFCReaderTask(String year, String month, String day) {
Year = year;
Month = month;
Day = day;
}
使用日期参数设置任务,例如:
new NFCReaderTask("2014", "10", "16").execute();
顺便说一句,如果您的日期值是整数,则不需要将它们作为字符串传递:
new NFCReaderTask(2014, 10, 16).execute();