异步任务导致UI卡住

时间:2012-11-07 14:13:54

标签: android multithreading

在我离开活动之前,我有2个异步任务(服务器请求)运行。 有时运行此异步任务的活动会一直停滞,直到异步任务完成,有时下一个活动会显示并停滞,直到异步任务完成。

我的问题是如何以我的活动的UI不会卡住的方式运行此任务(UI不依赖于异步任务中的响应)

5 个答案:

答案 0 :(得分:1)

您可能在活动代码中的某处调用了AsyncTask.get()。如果你在任务完成执行之前调用它,它将等待直到它完成(因此使你的UI卡住)。

答案 1 :(得分:1)

你能试试吗?

  1. 创建一个ProgressDialog,将其设置为不确定并显示它。
  2. 调用AsyncTask1并在其PostExecute中调用AsyncTask2。确保你需要在onUiThread上调用它。
  3. 在Astectask2的Postexecute中,关闭“进度”对话框并启动下一个“活动”。

答案 2 :(得分:0)

确保在第一个异步任务的onPostExecute()上开始下一个活动。如果您在新活动中有异步任务,请将其作为onCreate方法的最后一项。遵循这些简单的规则应该有所帮助

答案 3 :(得分:0)

仅在AsyncTask doInBackground()中编写代码并将其调用。这样您就可以检查它是否正在访问任何UI。

例如:TestAsync extends AsyncTask...

TestAsync async = new TestAsync();
async.execute();

试试这个。 通常,AsyncTask应该在单独的线程中运行。如果您创建两个实例。并调用execute,它应该独立执行。但是可能只有一个线程可用,所以它应该等待(在较低版本中,池大小为1。)。

@TargetApi(Build.VERSION_CODES.HONEYCOMB) // API 11
void startMyTask(AsyncTask asyncTask) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
        asyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
        asyncTask.execute(params);
}

其他方式是,你应该在正常的线程中运行它。

答案 4 :(得分:-1)

您必须在活动中一次拨打2个活动

  1. 因此,您必须使用同步的类或函数来调用asynk任务

  2. 或者您必须使用singleton类来调用该asynk任务,以便以同步方式调用api

  3. asynk任务使用主ui线程来完成任务,这可能是活动陷入困境的原因