【问题标题】:Android multithreading and servicesAndroid 多线程和服务
【发布时间】:2014-08-11 03:50:17
【问题描述】:

我对 Android 中的多线程有点困惑。我知道我们可以使用AsyncTaskHandler 来实现。一般什么时候应该在Android中扩展Thread Class来实现?谁能举个例子,我们只需要通过扩展线程类而不是AsyncTaskHandler来做到这一点。

  1. 考虑一个示例应用程序,我们在一个活动中有一个弹跳球(忘记动画部分),我需要每 20 分钟更改一次球的颜色,我需要从服务器获取颜色代码并更新球的 UI。现在我怎样才能做到这一点?有人可以解释使用AsyncTaskHandler 并且只使用线程类(没有AsynctaskHandler)吗?

  2. 我应该如何使用服务从服务器下载大型负载。

【问题讨论】:

    标签: java android multithreading service android-asynctask


    【解决方案1】:

    线程

    • 一般来说很长的任务
    • 通过thread.start()方法调用
    • 从任何线程触发
    • 在自己的线程上运行
    • 手动线程管理/代码可能会变得难以阅读

    异步任务

    • 必须与主线程通信的小任务
    • 通过execute()方法调用
    • 从主线程触发
    • 在工作线程上运行
    • 必须从主线程执行和创建

    服务

    • 没有 UI 的任务,但不应用于长任务。在服务中使用线程来处理长任务
    • onStartService()调用
    • 从任何线程触发
    • 在主线程上运行
    • 可能会阻塞 main(UI) 线程

    IntentService

    • 长任务通常不与主线程通信,如果需要通信则由 Handler 或广播完成
    • 通过 Intent 调用
    • 从主线程触发(在主线程上接收到意图并产生工作线程)
    • 在单独的线程上运行
    • 无法并行运行任务,并且多个意图在同一个工作线程上排队。

    【讨论】:

    • 您好,感谢您的回答,可以就Bouncing Ball App发表您的看法
    【解决方案2】:

    Thread:使用它将长时间运行的计算与主线程(UI 线程)分开。如果您不需要更新 UI 或将消息发送回 UI 线程,请将其用于长时间运行的任务。 但您实际上并不需要扩展 Thread 并通过覆盖 Thread 方法来编写您的逻辑。但与 java Thread 相比,HandlerThread 仍然有效。

    AsyncTask :它被设计为围绕ThreadHandler 的辅助类,不构成通用线程框架。 AsyncTasks 应该理想地用于短操作(最多几毫秒)。推荐用于 5 毫秒的任务执行。

    Service: 使用它在后台处理网络事务、播放音乐、执行文件 I/O 或与内容提供者交互。

    HandlerThread/HandlerHandlerThread 实际上是一个长时间运行的线程,它从队列中获取工作并对其进行操作。您甚至可以使用它通过 UI Thread 的Handler 将结果发送回 UI Thread。

    查看以下帖子了解更多详情:

    Asynctask vs Thread vs Services vs Loader

    Handler vs AsyncTask vs Thread

    Creating Background Service in Android

    Android: Toast in a thread

    【讨论】:

      【解决方案3】:

      AsyncTask 基本上是一个线程。它有 3 个回调方法(main),并按此顺序从上到下执行:

       1. onPreExecute()
       2. doInBackground()
       3. onPostExecute()
       4. onProgressUpdate()
      

      onPreExecute()onPostExecute() 在 UI 线程上运行,doInBackground() 本身就是一个单独的线程。如果您生成一个线程(不是AsyncTask),并尝试从中设置 UI 元素的属性,则会引发异常:创建视图的原始线程(UI 线程)只能修改它。所以只有UI线程有这两个属性:

      1. 只有它可以添加/修改 App 的 UI
      2. 不能被阻塞超过 5 秒(ANR 异常)

      所以为了一次性克服这两个限制,我们有AsyncTask,它可以在doInBackground() 中运行资源消耗操作(网络访问、实现游戏逻辑等),并且仍然提供从@ 更改 UI 的能力987654329@和onPreExecute()

      【讨论】:

      • 您好,感谢您的回答,可以就Bouncing Ball App发表您的看法
      • 在动画开始之前获取所有颜色代码并保存在本地==>使用处理程序计算 20 分钟==> 最终获得您的活动的引用(this),this.runOnUIThread(new runnable() )==> 这里只是改变你的球的颜色。
      猜你喜欢
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多