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方法的最后一项调用。遵循这些简单的规则应该会有帮助,你能试试吗

  • 创建ProgressDialog将其设置为不确定并显示
  • 调用AsyncTask1,并在其执行后调用AsyncTask2。确保您需要调用此onUiThread
  • 在Asynctask2的Postexecute中,关闭进度对话框并启动下一个活动
  • 你能试试这个吗

  • 创建ProgressDialog将其设置为不确定并显示
  • 调用AsyncTask1,并在其执行后调用AsyncTask2。确保您需要调用此onUiThread
  • 在Asynctask2的Postexecute中,关闭进度对话框并启动下一个活动

  • 您必须在活动中一次调用2个活动

  • 所以您必须使用synchronized类或函数来调用asynk任务

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

  • 因为asynk任务使用主ui线程来完成任务,所以这可能是活动被卡住的原因


  • 您必须在活动中一次调用2个活动

  • 所以您必须使用synchronized类或函数来调用asynk任务

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

  • 因为asynk任务使用主ui线程来完成任务,所以这可能是活动被卡住的原因


  • 仅在
    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
    对象并在另一个线程中运行它