【发布时间】:2012-03-15 21:59:52
【问题描述】:
我阅读了有关 AsyncTasks、Services、... 很清楚远程服务的用途。但是我遇到了麻烦,获得了 LocalService 的好处?典型的例子是“播放音乐”或下载大文件。但是我为什么要为此启动本地服务呢?
我做了一个小的 Async 任务,模拟这样一个任务。
AsyncTask<String, Integer, String> async = new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
System.out.println(i);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
return null;
}
};
async.execute("");
大多数答案是,(本地)服务用于长时间运行的活动,即使在主要活动关闭时也必须运行。好的 - 但我也可以在主活动中使用异步任务来做到这一点:
Button btnFinish = (Button) findViewById(R.id.button1);
btnFinish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
按下按钮调用 onDestroy(),但 Async 任务仍在运行?那么这和从 Service 启动 AsyncTask 不一样吗?
//编辑: 我进行了几次测试,我很确定异步任务的存在时间与 process 一样长。因此,如果我将它包装到本地服务中(常用方式) - 它也会与流程一样长......
那么为什么每个人都使用本地服务来完成诸如下载文件、同步等任务呢?!
【问题讨论】:
-
服务的优势在于它与您的活动生命周期无关 - groups.google.com/group/android-developers/browse_thread/thread/…
-
异步任务也不是 - 请参阅我的示例。我完成了 Activity 并且 Task 仍在运行...
-
是的,但是一旦完成,您将无法更新任何 UI。这可能会出现问题。
-
一般来说,问题不在于怎么做,而是怎么做更合理,Service有针对特定用例的特定设计, 这可能不适合 Activity。以 HttpClient 为例,你绝对可以在每个活动中按需创建新的 HttpClient。使用服务创建一个 HttpClient 并将所有与 http 相关的代码维护在一个中心位置会更有效和合理。可以从许多活动中重复使用。 IMO 我会将 Service 视为 MVC 中的 C,尽管它也可以做 UI 的事情。
标签: android android-asynctask android-service