1

巨大で時間がかかる可能性のあるデータを処理する必要があるアプリを作成しています。

今、私は IntentService について多くのことを読んでおり、実際にはすでに REST 呼び出しを処理するための通信クラスとして実装していますが、今は長時間のデータ処理に使用しようとしています。

タイトルバーに進行状況インジケーターを追加しましたが、ユーザーがクリックしたときに操作をキャンセルできるようになりました。

これを行うエレガントな方法はありますか?(Thread.interrupt()のようなもの)現在、静的ブール値の「実行中」があり、onStartCommandをオーバーライドしました

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getAction() != null && intent.getAction().equals("stop")) {
        running = false;
    }
    onStart(intent, startId);
    return START_NOT_STICKY;
}

私はこれが面倒でエレガントではないと感じており、本来意図されていないことに IntentService を悪用している可能性があると感じています。これを行うよりエレガントな方法はありますか?

行われていることを中断する必要があるため、 stopSelf() は機能しません。私はそれを試してみましたが、コードは実行され続けました。

asynctask を考えたのですが、タスクが生き残れないのではないかと心配です (操作には 15 分ほどかかる場合があります)。

4

2 に答える 2

2

IntentServiceそれはあなたの目的にはあまり適していないと思います。Service代わりに、直接拡張( http://developer.android.com/guide/components/services.html#ExtendingService ) し、特定の開始コマンドでメッセージ キュー (Handlerこの場合) をクリアして、ファイナライズ手順を実行できます。

于 2013-03-14T15:41:19.600 に答える
1

この状況に対して私が思いついた簡単な解決策は、バックグラウンド スレッド (IntentService がスピンアップする) コードがチェックし、onDestory() で設定されるフィールドを追加することでした。このフィールドは、stopService() を実行したときに呼び出されます。 IntentService クラスを呼び出します。

あなたのIntentServiceで:

@Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(LOGTAG, "got on destroy, asking background thread to stop as well");
        mPleaseStop = true;
    }

@Override
protected void onHandleIntent(Intent intent) {
    while(true) {
        Log.d(LOGTAG, "Doing some long running stuff here");
        if (mPleaseStop) {
            return;
        }
    }
} 

あとは電話するだけ

stopService(new Intent(this, MyIntentService.class))

正しくは、設定とチェックも同期する必要があります。

于 2015-05-25T05:22:55.783 に答える