AsynTask字段为空

时间:2014-10-16 17:49:27

标签: android android-asynctask

我有一个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()不起作用?

2 个答案:

答案 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();