2014-03-13 70 views
0

我是Android的多线程新手,我有疑问。我有一个的AsyncTask实例我称之为作为BackGroundTask,我开始这个为:等待,直到异步任务完成其工作,而不阻止UI线程或主线程

BackGroundTask bgTask = new BackGroundTask(); 
bgTask.execute(); 

不过我想等到这个电话打完它的执行,在进行代码的其他语句之前,不会阻塞UI线程,允许用户在应用程序中导航。

请帮助我,让我可以做到这一点。

+0

“等到此调用完成”和“没有阻塞UI线程”才有可能,只有等待发生在除UI线程之外的另一线程上。 –

回答

0

把你的代码放在AsyncTask的OnPostExecute方法中,你想在工作完成后执行它。

+0

我已经完成了。但是这会阻止用户在应用程序中导航。 –

+0

删除进度dialog.simply把你的代码放在onPostExecute –

+0

然而,正如前面所说,我可以等到这个任务完成 –

0

尝试使用bgTask.execute().get()这将等待后台任务完成,然后移动到被调用线程中的下一条指令。 (请注意,直到后台任务完成后,这将阻止称为线程)

0

我已经找到了答案,在 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()方法。

更优雅和可扩展的解决方案是使用接口。有关示例实现,请参阅此库。我刚开始,但它有一个你想要的例子。

相关问题