【问题标题】:start async task from onhandleintent从 onhandleintent 启动异步任务
【发布时间】:2012-11-09 13:45:58
【问题描述】:

我们应该从IntentServiceonHandleIntent() 方法中启动异步任务吗?我读到onHandleIntent()worker thread 中运行,所以从那里开始asyncTask 是否安全??

【问题讨论】:

    标签: android android-asynctask worker


    【解决方案1】:

    IntentServices 已经是后台进程;无需从那里启动 AsyncTask。 此外,从任何地方开始 AsyncTask 都是“安全的”; 它是一个帮助您实现多线程的辅助类。如果您在 Activity 中使用 Views,请确保不要在 AsyncTask 的 doInBackground()-method 中操作它。

    如果您需要在 IntentService 中生成多个线程,只需使用:

    new Thread(Runnable r).start();

    查看How to run a Runnable thread in Android?的示例

    如果您需要调用某种回调,请使用Handler。示例见http://www.vogella.com/articles/AndroidPerformance/article.html#handler

    【讨论】:

    • 从任何地方开始 AsyncTask 都不安全:stackoverflow.com/questions/4187960/… - 它只打算从主线程启动,如果你在 onHandleIntent 内启动它可能会起作用,因为它有一个 Looper
    • 如果我没有在 onHandleIntent() 中使用 asyncTask 怎么办?里面的代码还会在后台运行吗?
    • @zapl,感谢您的评论。 Raghav:只要调用你想调用的方法即可;当 IntentService 在不同的线程中运行时,您的 UI 不会冻结。如果出于某种原因您想在 IntentService 中生成多个线程,只需使用 new Thread(Runnable r).start();请参阅stackoverflow.com/questions/1921514/… 的示例
    • @Rookie ,是的,AFAIK,我使用一种方法直接在onHandleIntent(Intent intent) 方法中下载文件。它在所有设备和各种操作系统中都能正常工作。
    【解决方案2】:

    AsyncTask 类用于提供实现多线程的机制,所以你的事件线程不会被挂起,但是当你使用服务时,你不应该在服务中使用 AsyncTask,你可以使用线程,如果有的话长时间运行的任务将在服务中执行。

    【讨论】:

      【解决方案3】:

      如果您确实需要在 IntentService 中使用 AsyncTask,您可以在 AsyncTask 中创建一个调用 de doInBackGround 和 onPostExecute 的方法。像这样的:

      void executeFlowOnBackground(Params params) {
        onPostExecute(doInBackground(params));
      }
      

      在我的情况下,我这样做是因为所有 App 请求都是由扩展 AsyncTask 的类发出的,并且由于实现难以重构代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多