Android 异步任务的UI被卡住了
在我离开活动之前,我运行了两个异步任务(不执行服务器请求)。 有时,运行此异步任务的活动会被卡住,直到异步任务完成;有时,下一个活动会显示并被卡住,直到异步任务完成Android 异步任务的UI被卡住了,android,multithreading,Android,Multithreading,在我离开活动之前,我运行了两个异步任务(不执行服务器请求)。 有时,运行此异步任务的活动会被卡住,直到异步任务完成;有时,下一个活动会显示并被卡住,直到异步任务完成 我的问题是如何运行此任务,使我的活动的UI不会卡住(UI不依赖于异步任务中的响应)您可能正在调用活动代码中的AsyncTask.get()。如果您在任务完成执行之前调用它,它将一直等待直到它完成(从而使您的UI卡住)。您可能正在调用活动代码中的某个地方的AsyncTask.get()。如果您在任务完成执行之前调用它,它将等待直到它完
我的问题是如何运行此任务,使我的活动的UI不会卡住(UI不依赖于异步任务中的响应)您可能正在调用活动代码中的
AsyncTask.get()
。如果您在任务完成执行之前调用它,它将一直等待直到它完成(从而使您的UI卡住)。您可能正在调用活动代码中的某个地方的AsyncTask.get()
。如果您在任务完成执行之前调用它,它将等待直到它完成(从而使您的UI卡住)。请确保在第一个异步任务的onPostExecute()
上启动下一个活动。如果在新活动中有一个异步任务,则将其作为onCreate方法的最后一项调用。遵循这些简单规则将有助于确保在第一个异步任务的onPostExecute()
上启动下一个活动。如果在新活动中有一个异步任务,则将其作为onCreate方法的最后一项调用。遵循这些简单的规则应该会有帮助,你能试试吗
您必须在活动中一次调用2个活动
您必须在活动中一次调用2个活动
仅在
AsyncTask
doInBackground()
中编写代码并调用它。这样您就可以检查它是否正在访问任何UI
例如:TestAsync扩展了异步任务…
TestAsync async = new TestAsync();
async.execute();
试试这个。
通常,AsyncTask
应该在单独的线程中运行。如果创建两个实例。并调用execute,它应该独立执行。但可能只有一个线程可用,所以应该等待(在较低版本中,池大小为1)
另一种方法是,您应该在普通线程中运行它。只在
AsyncTask
doInBackground()
中编写代码并调用它。这样您就可以检查它是否正在访问任何UI
例如:TestAsync扩展了异步任务…
TestAsync async = new TestAsync();
async.execute();
试试这个。
通常,AsyncTask
应该在单独的线程中运行。如果创建两个实例。并调用execute,它应该独立执行。但可能只有一个线程可用,所以应该等待(在较低版本中,池大小为1)
另一种方法是,您应该在普通线程中运行它。实际上我根本不调用AsyncTask.get(),代码:
。新的updateBeforeLeaving().execute(ii);}finish();}
和updateBeforeLeaving()中我调用了一个auther异步任务,也没有“…get()”,很明显,在代码中的某个地方,任务的线程阻塞了UI线程。如果您没有调用“get()”,我们需要查看一些代码来找出问题所在。实际上,无法发布保密协议的代码。该问题是否可能是因为异步任务正在使用活动公共变量而导致的,这会导致在异步任务完成之前活动不会退出?如果答案是否定的-是否有其他替代异步任务的方法来完成任务?哪些公共变量?您在活动
类中声明的成员?而AsyncTask
的另一种替代方法就是在另一个线程中运行代码。如果您的AsyncTask
没有返回任何结果,只需创建一个Runnable
对象并在另一个线程中运行它。实际上,我根本不调用AsyncTask.get(),代码:。新的updateBeforeLeaving().execute(ii);}finish();}
和updateBeforeLeaving()中我调用了一个auther异步任务,也没有“…get()”,很明显,在代码中的某个地方,任务的线程阻塞了UI线程。如果您没有调用“get()”,我们需要查看一些代码来找出问题所在。实际上,无法发布保密协议的代码。该问题是否可能是因为异步任务正在使用活动公共变量而导致的,这会导致在异步任务完成之前活动不会退出?如果答案是否定的-是否有其他替代异步任务的方法来完成任务?哪些公共变量?您在活动
类中声明的成员?而AsyncTask
的另一种替代方法就是在另一个线程中运行代码。如果您的AsyncTask
没有返回任何结果,只需创建一个Runnable
对象并在另一个线程中运行它