HandlerThread 与 IntentService
HandlerThread vs IntentService
请教各位大侠,HandlerThread和IntentService的主要区别是什么,主要的使用场景是什么?
我知道 HandlerThread 包含一个 Looper,它管理由 Handler 提供的消息队列。据我了解,您可以为 HandlerThread 推送任务,它将执行。用于非 UI 相关的长 运行 操作非常有用,您可以通过 runOnUiThread() 将结果推回 UI .
相比之下,IntentService适合长运行,非UI相关的操作,可以顺序执行任务,当它完成jobs它正在调用 selfStop() 来关闭自己。如果一个 IntentService 正在处理一个任务,当一个新的请求到达时,它会添加到队列中并处理第二个,当它完成第一个时。
从我的角度来看,他们正在以非常相同的方式做同样的工作。
假设我有一个应用程序,用户点击一个按钮,我开始下载一个文件。如果用户多次点击,一个新任务将进入队列,只有在第一个任务完成后才启动第二个任务。
我应该使用什么? IntentService 还是 HandlerThread?
因此,在检查了 HandlerThread 和 IntentService 的源代码后,我发现了以下内容:
- IntentServie内部有一个HandlerThread实例(这是分离的工作线程)
- IntentService 在执行 onHandleIntent() 方法后调用 selfStop() 以关闭自身(因为它正在扩展服务 class)。
- IntentService 是从 Service class 本身扩展而来的,因此如果您愿意,可以在单独的进程中启动它。
IntentService onCreate() 方法,创建工作线程:
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
IntentService 自己的处理程序,需要在工作完成后终止服务:
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
在我的阅读中IntentService是HandlerThread和Service的组合。
欢迎任何进一步的答案和解决方案!
If the user taps multiple times, a new task is getting queued, launching the 2nd only when the 1st is done. What should I use?
IntentService和HandlerThread都可以做到这一点。在 HandlerThread 中,您可以通过使用处理程序来完成它,但在 IntentService 的情况下,它自己管理。
IntentService or HandlerThread?
您举的是下载文件的示例,但在这种情况下,用户还想停止下载。
在这种情况下,您无法使用 IntentService 以正确的方式执行此操作,因为没有任何官方方法可以在下载之间停止它(下载后它会自动停止)。因此,您必须继续使用 HandlerThread 和 Service。
但是,如果您的情况不是这样,那么您可以使用 IntentService,因为它很容易实现,而且您不必自行管理。
请教各位大侠,HandlerThread和IntentService的主要区别是什么,主要的使用场景是什么?
我知道 HandlerThread 包含一个 Looper,它管理由 Handler 提供的消息队列。据我了解,您可以为 HandlerThread 推送任务,它将执行。用于非 UI 相关的长 运行 操作非常有用,您可以通过 runOnUiThread() 将结果推回 UI .
相比之下,IntentService适合长运行,非UI相关的操作,可以顺序执行任务,当它完成jobs它正在调用 selfStop() 来关闭自己。如果一个 IntentService 正在处理一个任务,当一个新的请求到达时,它会添加到队列中并处理第二个,当它完成第一个时。
从我的角度来看,他们正在以非常相同的方式做同样的工作。 假设我有一个应用程序,用户点击一个按钮,我开始下载一个文件。如果用户多次点击,一个新任务将进入队列,只有在第一个任务完成后才启动第二个任务。 我应该使用什么? IntentService 还是 HandlerThread?
因此,在检查了 HandlerThread 和 IntentService 的源代码后,我发现了以下内容:
- IntentServie内部有一个HandlerThread实例(这是分离的工作线程)
- IntentService 在执行 onHandleIntent() 方法后调用 selfStop() 以关闭自身(因为它正在扩展服务 class)。
- IntentService 是从 Service class 本身扩展而来的,因此如果您愿意,可以在单独的进程中启动它。
IntentService onCreate() 方法,创建工作线程:
@Override
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
IntentService 自己的处理程序,需要在工作完成后终止服务:
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
在我的阅读中IntentService是HandlerThread和Service的组合。
欢迎任何进一步的答案和解决方案!
If the user taps multiple times, a new task is getting queued, launching the 2nd only when the 1st is done. What should I use?
IntentService和HandlerThread都可以做到这一点。在 HandlerThread 中,您可以通过使用处理程序来完成它,但在 IntentService 的情况下,它自己管理。
IntentService or HandlerThread?
您举的是下载文件的示例,但在这种情况下,用户还想停止下载。 在这种情况下,您无法使用 IntentService 以正确的方式执行此操作,因为没有任何官方方法可以在下载之间停止它(下载后它会自动停止)。因此,您必须继续使用 HandlerThread 和 Service。 但是,如果您的情况不是这样,那么您可以使用 IntentService,因为它很容易实现,而且您不必自行管理。