2012-03-09 10 views
5

アプリに別のスレッドで実行される部品があり、終了時に何らかのオブジェクトにコールバックすることがあります。典型的なパターンは、次のようになります。Androidで非同期コールバックを処理するための良い戦略は何ですか?

1)ビューまたはフラグメントによって一部のモデルが呼び出されます。呼び出しは何かを、いくつかのビューやモデルがスレッドを使用してフラグメント

model.doSomething(context, new Runnable() { 
    public void run() { /* run on the main thread when model finishes */ } 
}); 

2)またはAsyncTaskに由来して、呼び出し元のスレッドのコールバックを呼び出し - ハンドラ

void doSomething(Context context, Runnable callback) { 
    Handler handler = new Handler(); 
    // ... 
    // When finished (this is really done on some separate thread), 
    handler.post(callback); 
} 

3)を使用して、コールバックがビューやフラグメントを呼び出していくつかのコントロールロジックを進めるように対話する

コールバックは、ウィンドウに接続されていないビューに触れている可能性があり、アプリケーションが不安定になる可能性があります。

このような状況を処理するには、どのような良い方法がありますか?

答えて

1

モデルとビューの間のコミュニケーションをより一貫して処理したいと思うようです。これらを分離するための良い方法は、サービスを使用することです:

http://developer.android.com/reference/android/app/Service.html

アプリは、単一のプロセスで実行されている場合は、私が使用してはるかに簡単以来IntentServiceに探してお勧めします。

http://code.google.com/p/iosched/

は、それはかなり大規模なようだが、アーキテクチャがうまくローカルまたはリモートリソースから(データの懸念を分離することに関して考え抜かれ:

本の偉大な例では、Google IO 2011 IOSchedアプリです)。

ビューでコールバックをバインドするのではなく、独自のサービスでこのサービスを実行することの2つ目の利点は、サービスがアクティビティのライフサイクル外にあるため、アクティビティがいつでもコールバックに何が起こるか心配する必要がないことです。破壊/一時停止。このようなコールバックを使用すると、コールバックが呼び出され、アクティビティがまだ生きていない可能性があります。

+0

ステファンありがとう、私は2011 IOSのアプリを見てみましょう。ビューまたはフラグメントにメッセージを安全にポストバックする方法があるはずなので、サービスは過剰なようです。私はポスト(...)を使って実験してきましたが、ウィンドウが見えない場合の動作と一般的なAndroidパターンの感覚を得ています。 –

+0

これは過度のようですが、このようなコールバックパターンを使用しているときは、通常、長期間実行される非同期タスクを実行しています。呼び出しと完了の間に大きな時間差が存在する可能性があるため、時間がどのように状態に影響するかについて心配する必要があります。これは、アクティビティのライフサイクル内で作業する場合、アクティビティの現在の状態が何であるかを保証するものではないため、より面倒になります。 –

関連する問題