在 Android 的 IntentService 中等待异步回调

2022-09-01 14:19:49

我有一个在另一个类中启动异步任务,然后应该等待结果。IntentService

问题是,一旦方法完成运行,就会完成,对吧?IntentServiceonHandleIntent(...)

这意味着,通常,在启动异步任务后,将立即关闭,并且将不再在那里接收结果。IntentService

public class MyIntentService extends IntentService implements MyCallback {

    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    protected final void onHandleIntent(Intent intent) {
        MyOtherClass.runAsynchronousTask(this);
    }

}

public interface MyCallback {

    public void onReceiveResults(Object object);

}

public class MyOtherClass {

    public void runAsynchronousTask(MyCallback callback) {
        new Thread() {
            public void run() {
                // do some long-running work
                callback.onReceiveResults(...);
            }
        }.start();
    }

}

如何使上述代码段正常工作?我已经尝试过在启动任务后放入(任意持续时间)。它需要工作。Thread.sleep(15000)onHandleIntent(...)

但它绝对不是干净的解决方案。也许这甚至有一些严重的问题。

有没有更好的解决方案?


答案 1

使用标准类而不是 ,从回调启动异步任务,并在收到完成回调时销毁 。ServiceIntentServiceonStartCommand()Service

这样做的问题是,在并发运行任务的情况下,由于在它已经运行时再次启动,因此要正确处理 的破坏。如果需要处理这种情况,则可能需要设置一个正在运行的计数器或一组回调,并在它们全部完成时才销毁。ServiceServiceService


答案 2

我同意corsair992的观点,即通常您不必从 IntentService 进行异步调用,因为 IntentService 已经在工作线程上完成了它的工作。但是,如果必须这样做,则可以使用CountDownLatch

public class MyIntentService extends IntentService implements MyCallback {
    private CountDownLatch doneSignal = new CountDownLatch(1);

    public MyIntentService() {
        super("MyIntentService");
    }

    @Override
    protected final void onHandleIntent(Intent intent) {
        MyOtherClass.runAsynchronousTask(this);
        doneSignal.await();
    }

}

@Override
public void onReceiveResults(Object object) {
    doneSignal.countDown();
}

public interface MyCallback {

    public void onReceiveResults(Object object);

}

public class MyOtherClass {

    public void runAsynchronousTask(MyCallback callback) {
        new Thread() {
            public void run() {
                // do some long-running work
                callback.onReceiveResults(...);
            }
        }.start();
    }

}

推荐