我是Android的多线程新手,我有疑问。我有一个的AsyncTask实例我称之为作为BackGroundTask,我开始这个为:等待,直到异步任务完成其工作,而不阻止UI线程或主线程
BackGroundTask bgTask = new BackGroundTask();
bgTask.execute();
不过我想等到这个电话打完它的执行,在进行代码的其他语句之前,不会阻塞UI线程,允许用户在应用程序中导航。
请帮助我,让我可以做到这一点。
我是Android的多线程新手,我有疑问。我有一个的AsyncTask实例我称之为作为BackGroundTask,我开始这个为:等待,直到异步任务完成其工作,而不阻止UI线程或主线程
BackGroundTask bgTask = new BackGroundTask();
bgTask.execute();
不过我想等到这个电话打完它的执行,在进行代码的其他语句之前,不会阻塞UI线程,允许用户在应用程序中导航。
请帮助我,让我可以做到这一点。
把你的代码放在AsyncTask的OnPostExecute方法中,你想在工作完成后执行它。
我已经完成了。但是这会阻止用户在应用程序中导航。 –
删除进度dialog.simply把你的代码放在onPostExecute –
然而,正如前面所说,我可以等到这个任务完成 –
尝试使用bgTask.execute().get()
这将等待后台任务完成,然后移动到被调用线程中的下一条指令。 (请注意,直到后台任务完成后,这将阻止称为线程)
我已经找到了答案,在 How do I retrieve the data from AsyncTasks doInBackground()?
答案是使用回调如下所示,这是从上面的共享链接复制:
要做到这一点的唯一方法是使用CallBack。你可以做这样的事情:
new CallServiceTask(this).execute(request, url);
然后在你的CallServiceTask从该类在onPostExecute添加本地类变量和类方法:
private class CallServiceTask extends AsyncTask<Object, Void, Object[]>
{
RestClient caller;
CallServiceTask(RestClient caller) {
this.caller = caller;
}
protected Object[] doInBackground(Object... params)
{
HttpUriRequest req = (HttpUriRequest) params[0];
String url = (String) params[1];
return executeRequest(req, url);
}
protected onPostExecute(Object result) {
caller.onBackgroundTaskCompleted(result);
}
}
然后简单的使用对象为你喜欢RestClient类中的onBackgroundTaskCompleted()方法。
更优雅和可扩展的解决方案是使用接口。有关示例实现,请参阅此库。我刚开始,但它有一个你想要的例子。
“等到此调用完成”和“没有阻塞UI线程”才有可能,只有等待发生在除UI线程之外的另一线程上。 –