在我离开活动之前,我有 2 个异步任务(执行服务器请求)正在运行。有时运行此异步任务的活动会卡住,直到异步任务完成,有时下一个活动会显示并卡住,直到异步任务完成。
我的问题是我如何以我的活动的 UI 不会卡住的方式运行此任务(UI 不依赖于异步任务中的响应)
在我离开活动之前,我有 2 个异步任务(执行服务器请求)正在运行。有时运行此异步任务的活动会卡住,直到异步任务完成,有时下一个活动会显示并卡住,直到异步任务完成。
我的问题是我如何以我的活动的 UI 不会卡住的方式运行此任务(UI 不依赖于异步任务中的响应)
您可能正在调用AsyncTask.get()
活动代码中的某个位置。如果您在任务完成执行之前调用它,它会等到它完成(从而使您的 UI 卡住)。
你能试试这个。
确保您在onPostExecute()
第一个异步任务中开始您的下一个活动。如果您在新活动中有一个异步任务,请将其作为 onCreate 方法的最后一项调用。遵循这些简单的规则应该会有所帮助
只写代码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);
}
其他方式是,您应该在普通线程中运行它。
您必须在您的活动中一次调用 2 个活动
所以要么你必须使用同步类或函数来调用异步任务
或者您必须使用单例类来调用该异步任务,以便以同步方式调用 api
因为异步任务使用主 ui 线程来完成任务,所以这可能是活动卡住的原因