从AsyncTask类onPostExecute方法返回值

时间:2012-12-11 07:50:03

标签: android android-asynctask return-value

好的,现在我的Class A包含一些微调器,这些值将由Class B填充,扩展AsnycTask,从Web服务中获取微调器值。在B类中,我设法检索值,在Toast中显示。现在的问题是如何将这些微调器值传递回A类?

我试过

Can OnPostExcecute method in AsyncTask RETURN values?

Class A传递给Class B并将值存储在Class A的公共变量中,如下所示

@Override
protected void onPostExecute(String result)
{
  classA.classAvariable = result;
}

然而,每当我尝试阅读classAvariable时,我总会得到NullPointer Exception。 似乎变量从未分配过结果。 出于可读性目的,我需要单独Class B而不是使用内联类。

我的Java程序员是什么想法?

4 个答案:

答案 0 :(得分:32)

我猜你在设置之前尝试读取A类变量。 尝试使用回调函数。在回调函数中传递值并刷新微调器。

您可以创建interface,将其传递给AsyncTask(在构造函数中),然后在onPostExecute中调用方法

例如:

您的界面:

public interface OnTaskCompleted{
    void onTaskCompleted(values);
}

您的活动:

public YourActivity implements OnTaskCompleted{
    //your Activity
    YourTask  task = new YourTask(this); // here is the initalization code for your asyncTask
}

你的AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

    public YourTask(OnTaskCompleted listener){
        this.listener=listener;
    }

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted(values);
    }
}

答案 1 :(得分:1)

这里的问题是,当你执行你的AsynchTask时,它的doInBackground()方法运行在单独的线程中,并且启动了这个AsynchTask的线程向前移动,因此AsynchTask对你的变量发生的变化没有反映在父线程上(谁说明了这个AsynchTask)马上。

示例 -

class MyAsynchTask
{

doInbackground()
{
a = 2;
}

}


int a = 5;

new MyAsynchTask().execute();

//这里仍然是5

答案 2 :(得分:0)

创建一个类似OnCompletRequest()的界面,然后将其传递给您的ClassB构造函数,并在complete(yourList list)

方法中调用此界面中的方法,例如onPostExecute(String result)

答案 3 :(得分:-1)

您可以通过调用protected Boolean doInBackground()类的get()方法来获取AsyncTask的返回值:

例如你有 AsyncTask 类作为 dbClass 喜欢

dbClass bg = new dbClass(this);
String Order_id = bg.execute(constr,data).get();

在这里,我将 constr 作为 URL 传递,将 data 作为输入字符串传递,以使我的类动态化。

但要注意 UI 的响应能力,因为 get() 会等待计算完成并会阻塞 UI 线程。