好的,现在我的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程序员是什么想法?
答案 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 线程。