等待异步任务完成其工作而不阻止UI线程或主线程

时间:2014-03-13 06:31:48

标签: multithreading user-interface android-asynctask

我是Android的多线程新手,我有一个疑问。我有一个AsyncTask实例,我将其称为BackGroundTask,我将其作为开始:

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

但是我想等到这个调用完成它的执行,然后继续执行其他代码语句而不阻塞UI线程并允许用户浏览应用程序。

请帮助我,以便我能做到这一点。

3 个答案:

答案 0 :(得分:0)

  

将你的代码放在AsyncTask的onPostExecute方法中,你就可以了   希望在完成工作后执行工作线程。

答案 1 :(得分:0)

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

答案 2 :(得分: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()方法中直接使用Object。

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