Android でサービスを使用する場合
-
25-09-2019 - |
質問
メインアクティビティでのボタンの押下に応答してデータをフェッチするクラスがあります。残念ながら、このクラスはアクティビティやサービスではないため、問題が発生し続けます。たとえば、コンテキストがなければ、リソース ID を文字列に変換できません。
getString(R.string.example_string); // Doesn't work
このクラスをサービスにして、クラスが閉じられたときにメインのアクティビティでクラスを停止させる必要がありますか?このようにアクティビティからこのクラスにコンテキストを渡すべきでしょうか?
MyClass c = new MyClass(this);
それとも、この問題を処理するためのより良い方法はありますか?
この問題は、このクラスからトーストを送信しようとしたときにも発生します。
アップデート: エーリッヒとヤヌシュは私にその方向を教えてくれました。 AsyncTask
このクラスは、新しいスレッドを作成し、そのスレッドを決して強制終了しないことを除いて、完全に機能します。これは、ユーザーがボタンを押すたびに、別のスレッドが追加され、古いスレッドはそのままそこに残ることを意味します。
解決
あなたはライフサイクルがあなたの活動から切り離されてバックグラウンドアクションを持っている場合は、私がService
を使用します。あなたはそれを渡す必要はありませんので、その場合には、Service
は、独自のContext
を持っています。もし、しかし、あなたはUIイベントに応答して、バックグラウンドアクションを実行する(必要に応じてバックUIに結果を投稿する必要がありますスレッド)、私はあなたがAsyncTask
を使用することをお勧めします。
他のヒント
私も Erich の意見に同意します。Web バックエンドに変更を投稿したり、携帯電話のメモリから何かをロードして画面に表示するなどの小さなことしかない場合は、 非同期タスク. 。タスクが非常に「早く」(数秒) 終了する場合は、アクティビティ内に匿名クラスを作成できます。これにより、タスク内の外部アクティビティへの暗黙的な参照を使用できるようになり、そこからコンテキストを取得できるようになります。
タスクが長時間実行されている場合は、コンテキストを渡すことができます。コンテキストを渡す場合は、this.getApplicationContext() を使用してアクティビティからこれを渡さないようにしてください。これにより、アクティビティへの参照の数が最小限に抑えられ、ガベージ コレクターが適切にクリーンアップできるようになります。