IntentService
別のクラスで非同期タスクを開始し、その結果を待機する必要がある があります。
問題は、メソッドの実行が終了するIntentService
とすぐに終了してしまうことです。onHandleIntent(...)
つまり、通常は、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
Service
の代わりに標準クラスを使用しIntentService
、コールバックから非同期タスクを開始しonStartCommand()
、Service
完了コールバックを受信したら を破棄します。
この場合の問題は、がすでに実行されているときに が再度開始されたService
結果として、同時に実行されているタスクの場合に の破棄を正しく処理するService
ことです。このケースを処理する必要がある場合は、実行中のカウンターまたはコールバックのセットを設定し、すべてService
が完了した場合にのみ を破棄する必要がある可能性があります。