我有3个简化的课程如下:
Main.java
public class Main extends Activity implements SomeTask.OnAsyncRequestComplete {
SomeTask someTask;
String someString = ""; //checkpoint 1
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new SomeDialog(this);
}
@Override
public void asyncResponseSomeTask(String response) {
someString = someTask.someString; //checkpoint 4
}
}
SomeDialog.java
public class SomeDialog {
public SomeDialog(Context context){
SomeTask someTask = new SomeTask(context);
someTask.execute("");
}
}
SomeTask.java
public class SomeTask extends AsyncTask<String, Integer, String> {
String someString;
OnAsyncRequestComplete caller;
Context context;
public SomeTask(Context a) {
caller = (OnAsyncRequestComplete) a;
context = a;
}
public String doInBackground(String... urls) {
doSomething();
return "";
}
private void doSomething() {
//does some stuff here and gets value from a webpage
someString = "some string"; //checkpoint 2
}
public void onPostExecute(String response) {
//checkpoint 3
caller.asyncResponseSomeTask(response);
}
}
如您所见,Main
调用SomeDialog
并传递其上下文。 SomeDialog
调用并执行SomeTask
,其onPostExecute
将返回Main
。
我有兴趣将someString
的{{1}}的值恢复为SomeTask
。
检查Main
沿其检查点的值,我发现:
检查点1:someString
为空(&#34;&#34;)
检查点2:someString
不为空(&#34;某些字符串&#34;)
检查点3:someString
不为空(&#34;某些字符串&#34;)
检查站4:someString
为空(&#34;&#34;)
因此,在我看来,someString
正在完美地完成其工作(与网页通信并获取正确的数据)。在SomeTask
中,它甚至具有正确的价值。然而,当onPostExecute
调用其Main
方法并且值丢失时,会发生一些事情。也许asyncResponseSomeTask
在等待Main
完成之前还没等完?但如果是这种情况,那么我会在2或3之前得到检查点4的值(因为与网站沟通确实需要一些时间),我不会发现这种情况。
我的问题是:如何在SomeTask
中获得someString
正确的值?
我对从Main
(而不是SomeTask
)拨打Main
并不特别感兴趣。我知道这样做确实有效并产生了正确的结果,但我想知道如何以这种方式做到这一点。
答案 0 :(得分:0)
您将获得空字符串,因为您从doInBackground()
返回空字符串,该字符串作为onPostExecute()
的输入并最终返回回调asyncResponseSomeTask()
。
如何在Main中获得someString的正确值?
public String doInBackground(String... urls) {
return doSomething();
}
private String doSomething() {
//does some stuff here and gets value from a webpage
someString = "some string"; //checkpoint 2
return someString;
}