【问题标题】:When to use a service in Android何时在 Android 中使用服务
【发布时间】:2010-06-09 14:30:22
【问题描述】:

我有一个类来获取数据以响应主活动中的按钮按下。不幸的是,我一直遇到问题,因为这个类不是活动或服务。例如,如果没有上下文,我无法将资源 id 转换为字符串:

getString(R.string.example_string); // Doesn't work

我应该把这个类变成一个服务并让主 Activity 在它关闭时停止这个类吗?我应该像这样将 Activity 中的 Context 传递给这个类吗?

MyClass c = new MyClass(this);

或者有没有更好的方法来处理这个问题?

当我尝试从此类发送 Toast 时也会出现此问题。

更新: Erich 和 Janusz 向我指出了运行良好的 AsyncTask 类的方向,除了它创建一个新线程并且从不终止该线程。这意味着每次用户按下按钮时,都会添加另一个线程,而旧线程就坐在那里。

【问题讨论】:

    标签: android multithreading android-asynctask


    【解决方案1】:

    如果您的后台操作的生命周期与您的活动分离,我会使用Service。在这种情况下,Service 将拥有自己的Context,因此您无需将其传入。但是,如果您需要执行后台操作以响应 UI 事件(并可选择发布结果回到 UI 线程),我建议你使用AsyncTask

    【讨论】:

    • 非常感谢! AsyncTask 正是我想要的。现在唯一的问题是 AsyncTask 线程继续运行,即使在调用 onPostExecute() 之后也是如此。由于每次需要使用 AsyncTask 时都必须创建一个新实例,因此最终会创建大量剩余线程。如何确保线程死亡?
    【解决方案2】:

    我同意 Erich 的观点,如果您只有一些小事,例如将更改发布到 Web 后端或从手机内存中加载某些内容以在屏幕上显示,请使用 Async Task。如果任务将非常“快速”(几秒钟)退出,您可以在您的活动中创建一个匿名类。这将使您能够使用对任务内部外部活动的隐式引用,并且您可以从那里获取上下文。

    如果任务运行时间较长,您可以传递上下文。如果您要传递上下文,请尝试不从活动中传递 this.getApplicationContext() 这将最大限度地减少对您的活动的引用数量,并使垃圾收集器能够正确清理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 2015-05-03
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多