9

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

我试过了

AsyncTask 中的 OnPostExcecute 方法可以返回值吗?

通过将值传递Class A并存储在如下Class B的公共变量中Class A

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

但是,每当我尝试阅读时,classAvariable我总是会得到一个NullPointer Exception. 似乎从未为变量分配结果。出于可读性目的,我需要分开Class B而不是用作内联类。

我的 Java 程序员同行有什么想法吗?

4

4 回答 4

33

我猜您正在尝试在设置 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);
    }
}
于 2012-12-11T08:00:17.480 回答
1

这里的问题是,当您执行 AsynchTask 时,它的 doInBackground() 方法在单独的线程中运行,并且启动此 AsynchTask 的线程向前移动,因此 AsynchTask 在您的变量上发生的更改不会反映在父线程上(谁声明了这个 AsynchTask)立即地。

例子 -

class MyAsynchTask
{

doInbackground()
{
a = 2;
}

}


int a = 5;

new MyAsynchTask().execute();

// 这里仍然是 5

于 2012-12-11T09:23:00.877 回答
0

创建一个接口,OnCompletRequest()然后将其传递给您的 ClassB 构造函数,并简单地调用此接口内complete(yourList list) 的方法,例如在onPostExecute(String result)

于 2012-12-11T08:02:42.220 回答
-1

protected Boolean doInBackground()您可以通过调用class的get()方法来检索 的返回值:AsyncTask

例如,您有类似的AsyncTask课程dbClass

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

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

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

于 2021-06-24T14:23:44.477 回答