我研究如何实现 Android 的 AsyncTask 类已经有一段时间了。基本上,我希望它执行经典场景:在进行网络调用时简单地为不确定的加载轮设置动画。然而,在实践中,我在让它按照我想要的方式工作时遇到了一些问题。
我的代码当前看起来像这样:(在我想要的 AsyncTask 实现之前)
String result = timeConsumingNetworkCall(String someData, ArrayList stuff1);
doStuff(result);
String result = timeConsumingNetworkCall(String otherData, ArrayList stuff2);
doOtherStuff(result);
String result = timeConsumingNetworkCall(String dataAgain, ArrayList stuff3);
doYetEvenMore(result);
我希望能够重用我的 AsyncTask 调用来将数据传递给它,它进行网络调用,然后返回我可以按照我的意愿处理的数据,就像我上面所做的那样。
现在 - 这很完美,当然应用程序似乎在没有加载的情况下“挂起”。 AsyncTask 来了。也许我只是还不太“明白” - 但是如何在 AsyncTask 之外返回数据以便 doStuffToUI()
等可以使用它?
最终,如果我可以使用与此类似的 AsyncTask:
String result = new PostToFile("function_name", keysAndValues).execute().getResult();
doStuff(result); // this shouldn't execute until the AsyncTask is done
我这样做对吗?这是应该/可以做到的吗?下面是我的 AsyncTask 类,为简洁起见进行了缩短。
private class PostToFile extends AsyncTask<PostToFile, Void, Void>{
private String functionName;
private ArrayList<NameValuePair> postKeyValuePairs;
private String result = "";
public PostToFile(String function, ArrayList<NameValuePair> keyValuePairs){
functionName= function;
postKeyValuePairs = keyValuePairs;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(BaseActivity.getInstance(), "Loading", "Please wait...", true, false);
}
@Override
protected Void doInBackground(PostToFile... params) {
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair(FUNCTION_KEYWORD, functionName));
for (int i = 0; i < postKeyValuePairs.size(); i++) {
nameValuePairs.add(postKeyValuePairs.get(i));
}
try{
// ***do the POST magic.***
result = response.toString();
}
catch (Exception e){
// clean up my mess
}
return null;
}
private String getResult(){
return result; // can I use this somehow???
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
}
}
感谢任何帮助,提前非常感谢。如果需要的话,我很乐意进行澄清。
最佳答案
doStuff(result); this shouldn't execute until the AsyncTask is done
那么您将需要使用AsyncTask.get()如果需要,则等待计算完成,然后检索其结果。
因为调用 AsyncTask.get()
会卡住主 UI 线程,直到 doInBackground
执行未完成,所以您需要使用 Thread 来避免卡住 UI 和 >runOnUiThread
用于在 AsyncTask 执行完成后更新 Ui 元素。
示例:-
public void ThreaddoStuff(){
Thread th=new Thread(){
@Override
public void run(){
// start AsyncTask exection here
String result = new PostToFile("function_name",
keysAndValues).execute().get().getResult();
// now call doStuff by passing result
doStuff(result);
}
};
th.start();
}
关于java - Android的AsyncTask : multiple params,返回值,等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15153919/