0

メインアクティビティでボタンを押すと応答してデータをフェッチするクラスがあります。残念ながら、このクラスはアクティビティでもサービスでもないため、問題が発生し続けます。たとえば、コンテキストがないと、リソースIDを文字列に変換できません。

getString(R.string.example_string); // Doesn't work

このクラスをサービスにし、メインのアクティビティでクラスが閉じられたときにクラスを停止する必要がありますか?このように、アクティビティからこのクラスにコンテキストを渡す必要がありますか?

MyClass c = new MyClass(this);

または、この問題を処理するためのより良い方法はありますか?

この問題は、このクラスからトーストを送信しようとしたときにも発生します。

更新: ErichとJanuszAsyncTaskは、新しいスレッドを作成し、そのスレッドを強制終了しないことを除いて、完全に機能するクラスの方向を示しました。これは、ユーザーがボタンを押すたびに、別のスレッドが追加され、古いスレッドがそこに座っていることを意味します。

4

2 に答える 2

4

ライフサイクルがアクティビティから切り離されているバックグラウンドアクションがある場合は、を使用しServiceます。その場合、はService独自のを持っているContextので、それを渡す必要はありません。ただし、UIイベントに応答してバックグラウンドアクションを実行する必要がある場合(およびオプションで結果をUIスレッドにポストバックする必要がある場合) 、を使用することをお勧めしますAsyncTask

于 2010-06-09T14:35:53.587 に答える
2

Webバックエンドに変更を投稿したり、電話のメモリから何かを読み込んで画面に表示したりするような小さなものしかない場合は、非同期タスクを使用して、Erichに同意します。タスクが非常に「迅速」(数秒)で終了する場合は、アクティビティ内で匿名クラスを作成できます。これにより、タスク内の外部アクティビティへの暗黙の参照を使用できるようになり、そこからコンテキストを取得できます。

タスクが長時間実行されている場合は、コンテキストを渡すことができます。コンテキストを渡す場合は、アクティビティからこれを渡さないようにしてください。this.getApplicationContext()を使用すると、アクティビティへの参照の数が最小限に抑えられ、ガベージコレクターが適切にクリーンアップできるようになります。

于 2010-06-09T14:43:08.937 に答える