【问题标题】:Is it OK to use Thread instead of Service in Android home screen widget?在 Android 主屏幕小部件中使用 Thread 而不是 Service 可以吗?
【发布时间】:2010-03-04 18:15:33
【问题描述】:

我正在按照 Jeff Shakey 的教程 http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html 编写一个主屏幕小部件。

本教程使用服务来避免任何 ANR 超时。我只是想知道,我可以使用 Thread 代替 service 来完成获取数据和更新 RemoteViews 的工作吗?我不想创建服务,因为 Thread 更容易处理并将数据传递给 Thread。

谢谢。

【问题讨论】:

    标签: android


    【解决方案1】:

    你不应该依赖线程。它不能保证工作。根据类似情况的经验,线程方法在模拟器和三星 Galaxy 上有效,但在 g1 上不可靠。因此,您应该真正尝试使用服务。这很容易:在您的清单和 startService 中定义。通过意图传递数据有点麻烦,但它是易于管理的,而且整个方法肯定更健壮。

    【讨论】:

    • 这是否意味着线程无法在 Android 上运行,或者只是不适用于主屏幕小部件?主屏幕小部件、仅服务或服务+线程的最佳实践是什么?我必须从互联网加载数据来更新小部件屏幕,我必须避免 ANR 超时。我仅在模拟器和 HTC Hero 上测试了服务 + 线程和线程。它工作正常。如果它不能在其他设备上工作,我将放弃线程的想法。
    • 请阅读进程生命周期:developer.android.com/intl/de/guide/topics/… 请注意,如果您的进程中没有运行任何组件(前台活动、onReceive() 中的接收、正在运行的服务或您的前台客户端)内容提供者),那么你的进程就会被系统认为是空的,随时可能被杀死。
    • 另外,您还没有这么说,但请不要让您的服务在有人使用您的小部件的整个过程中一直运行。这是非常重量级的,如果用户有相当数量的此类小部件,他们很容易用完 RAM 来运行所有内容。从 Android 2.0 开始,他们可以很容易地分辨出你是谁在用完他们的 RAM,并采取行动,比如降低评级和市场上的 cmets。
    • 哦,最后一件事——线程和服务是完全正交的概念。它们不涵盖任何类似的功能。如果您需要一个线程(在主线程上工作以避免 ANR),无论您是否有服务,都需要它。因此,编写一个创建线程来完成其工作的服务并不少见。
    【解决方案2】:

    我读过一篇文章说,为了避免 ANR,服务有时是不够的。需要线程。

    见:http://blog.elsdoerfer.name/2009/06/03/writing-an-android-widget-what-the-docs-dont-tell-you/

    “如果您正在做任何可能需要更长时间的事情,我们鼓励您使用服务来执行您的小部件更新,以避免应用程序无响应 (ANR) 超时。但是,这通常是不够的。. .....

    解决方案是让您的服务启动一个单独的线程。例如,请参阅 Jeffrey Sharkey 的 android-sky Widget。”

    有什么想法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多