0

フラグメントから onDestroy() から長い操作タスクを実行したい。私の目標は、ユーザーが最近のアプリからスワイプしてアプリケーションを閉じた場合に備えて、ネットワーク呼び出しを呼び出して一部のデータを削除することです。onDestroy() が呼び出されたときにインテントを開始したいと考えています。

現時点では、インテントを開始しようとするたびに、onDestroy() が既にアプリケーションを強制終了しているため、呼び出しを操作する前にコンテキストが失われます。

私はこのオプションを使用したくありません: onDestroy で長時間実行する操作を実行するのは、そのようにスレッドを実行するのは正しい方法ではなく、危険なハックのように思えます。

アクティビティの onDestroy() から操作を呼び出すと、同じエラーが発生しました。

もちろん、操作が完了するまで、UIスレッドで作業をしたり、 onDestroy() を「延期」したりしたくありません。

クリアランスのために、getContext() は null ではありませんが、インテントの送信は非同期操作であるため、SomeService クラスに到達するまでに、コンテキストは既に null です。

@Override
    public void onDestroy() {
         Intent intent = new Intent(getContext(), SomeService.class);
         getContext().startService(intent);
         super.onDestroy();
    }
4

2 に答える 2

1

onCreate()あなたの言う間にサービスを開始してバインドし、サービスをバインドするActivityと、に配置されたクリーンアップユーティリティを簡単に開始できるようになることをお勧めしますService。つまり、サービスの開始とクリーンアップの開始を分割する必要があります。

お気に入り:

//somewhere in onCreate()
myServiceIntent = new Intent(this.getApplicationContext(), MyService.class);
context.startService(myServiceIntent);
context.bindService(myServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);

そして、onDestroy()

public void onDestroy() {
     myService.cleanup();
     super.onDestroy();
}

サービス バインディングの詳細を読む

于 2016-04-26T08:59:35.497 に答える
0

onDestroy ()が呼び出されることが保証されていないことに注意してください。

アプリケーション コンテキストを使用します。

バインドされたサービスは、コンポーネントがバインドされている限り存続するため、サービスを開始したバリアントの方が優れています。ジョブの完了後に stopSelf() を使用することを忘れないでください。

于 2016-04-26T09:15:20.833 に答える