有没有办法让客户端应用程序在不破坏服务和丢失其关联上下文的情况下终止 运行 请求?
Is there a way for the client application to kill a running request without destroying the service and losing its associated context?
我按照建议在后台使用绑定服务 运行 cpu 密集型任务以避免 ANR。客户端应用程序将消息发送到在其 Handler
.
的 handleMessage()
方法中处理它们的绑定服务
由于某些请求可能需要很长时间才能得到答复,我想为用户提供 "abort/abandon" 运行ning 请求的能力。但是,我无法销毁该服务,因为我需要为将来的请求保留其上下文。从应用程序发送 "abort" 请求将在服务完成其当前任务后排队并由服务处理,这显然为时已晚并且未实现请求的功能。
客户端应用程序有没有办法在不终止服务和丢失其关联上下文的情况下终止 运行ning 请求?
* 编辑 *
感谢 Mario 的推荐和这个 link,这是我实现的解决方案:
ExecutorService executor = Executors.newFixedThreadPool(1);
private volatile static Future<?> BackgroundSolveFuture = null;
public class IncomingHandler extends Handler {
@Override
public void handleMessage(Message message) {
msg = message;
msgArg1 = message.arg1;
msgWhat = message.what;
if (message.replyTo != null) {
mClient = new Messenger(message.replyTo.getBinder());
}
switch (msgWhat) {
case MSG_ABORT:
BackgroundSolveFuture = null;
break;
case MSG_SOLVE:case MSG_ANALYZE:case MSG_SUGGEST:case MSG_STEP:
BackgroundSolveFuture = executor.submit(new Runnable() {
public void run() {
solve();
}
});
break;
...
里面solve()
我定期检查BackgroundSolveFuture
是否已经设置为null
:
if (BackgroundSolveFuture == null) {
undoAction(true);
return;
}
是的。
您发送中止消息的想法没问题。
您只需要为每个任务创建新线程。
例如,你有两种类型的消息 DOIT 和 ABORT,当你收到你创建的消息 DOIT 和 运行 带有任务的新线程时,你甚至可以保留对该线程的引用。
这允许快速完成 handleMessage() 方法。
然后新消息来了:ABORT,你有对线程的引用,你可以中断thread/task。
我按照建议在后台使用绑定服务 运行 cpu 密集型任务以避免 ANR。客户端应用程序将消息发送到在其 Handler
.
handleMessage()
方法中处理它们的绑定服务
由于某些请求可能需要很长时间才能得到答复,我想为用户提供 "abort/abandon" 运行ning 请求的能力。但是,我无法销毁该服务,因为我需要为将来的请求保留其上下文。从应用程序发送 "abort" 请求将在服务完成其当前任务后排队并由服务处理,这显然为时已晚并且未实现请求的功能。
客户端应用程序有没有办法在不终止服务和丢失其关联上下文的情况下终止 运行ning 请求?
* 编辑 * 感谢 Mario 的推荐和这个 link,这是我实现的解决方案:
ExecutorService executor = Executors.newFixedThreadPool(1);
private volatile static Future<?> BackgroundSolveFuture = null;
public class IncomingHandler extends Handler {
@Override
public void handleMessage(Message message) {
msg = message;
msgArg1 = message.arg1;
msgWhat = message.what;
if (message.replyTo != null) {
mClient = new Messenger(message.replyTo.getBinder());
}
switch (msgWhat) {
case MSG_ABORT:
BackgroundSolveFuture = null;
break;
case MSG_SOLVE:case MSG_ANALYZE:case MSG_SUGGEST:case MSG_STEP:
BackgroundSolveFuture = executor.submit(new Runnable() {
public void run() {
solve();
}
});
break;
...
里面solve()
我定期检查BackgroundSolveFuture
是否已经设置为null
:
if (BackgroundSolveFuture == null) {
undoAction(true);
return;
}
是的。
您发送中止消息的想法没问题。
您只需要为每个任务创建新线程。 例如,你有两种类型的消息 DOIT 和 ABORT,当你收到你创建的消息 DOIT 和 运行 带有任务的新线程时,你甚至可以保留对该线程的引用。
这允许快速完成 handleMessage() 方法。
然后新消息来了:ABORT,你有对线程的引用,你可以中断thread/task。