[英]Android AsyncTask wait until finished
我正在Android应用程序中使用AsyncTask
调用Web服务,但我不知道如何等待onPostExecute
完成:
//Call Async Web Service here
AsyncCallWS task = new AsyncCallWS();
task.execute();
//Need to wait to fill this in ** Its not waiting.
String sCall = rslt;
String[] aCall = sCall.split("//|");
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute");
}
@Override
protected Void doInBackground(Void... params) {
Log.i(TAG, "doInBackground");
GetURL();
return null;
}
@Override
protected void onPostExecute(Void result) {
Log.i(TAG, "onPostExecute");
try{
//Results HERE
rslt = resultString.toString();
}
catch(Exception ex)
{rslt = ex.toString()+ "|" + ex.toString();}
}
}
我不清楚您是否可以/不想从onPostExecute进行操作,但是如果您想执行与任务无关的操作,则可以使用回调(以便您可以在任何地方运行任务)
private class OnFinishedListener {
void onFinished(String rslt);
}
private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
private OnFinishedListener mAfter;
public AsyncCallWS(OnFinishedListener after) {
mAfter = after;
}
...
@Override
protected void onPostExecute(Void result) {
....
if (mAfter != null) {
//you didnt illustrate what resultString is, you might
//want this to be the returned value from doInBackground
mAfter.onFinished(resultString.toString());
}
}
}
用法
new AsyncCallWS(new OnFinishedListener {
public void onFinished(String rslt) {
//for example
String sCall = rslt;
String[] aCall = sCall.split("//|");
}
}).execute();
您可以在后台线程中使用Tasks.await(task)
。 不要在UI线程中使用它。 您还可以为任务Tasks.await(task, 500, TimeUnit.MILLISECONDS);
设置超时Tasks.await(task, 500, TimeUnit.MILLISECONDS);
使用getStatus()方法。
while (task.getStatus() != Status.FINISHED);
更好的方法是在onPostExecute()
方法内调用split()
,因为onPostExecute()
无论如何都在UI线程上运行, while()
调用将阻止当前正在运行的线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.