2012-01-27 17 views
0

多くのオブジェクトを作成できるServiceを作成したいと思います。各オブジェクトはインターネットに接続し、JSONデータと写真をダウンロードします。これは大変簡単ですが、一度に1つずつ実行する必要があります。つまり、最初のオブジェクトがアクションを完了するまで新しいオブジェクトを作成することはできません。オブジェクトがアクションを実行したことをどのように知ることができますか?

私のServiceがオブジェクトがそのアクションを実行した時期を知る最良の方法は何ですか?

enter image description here

+0

その他の制限はありますか?なぜあなたはオブジェクトインスタンスのサービスへの参照を保持できません(そして、オブジェクトがGCになるのではないかと思いますが)、そしてサービス終了時にメソッドを呼び出すのですか? – Luis

+0

私はこれまでサービスでメソッドを呼び出していましたが、もっと良い方法があるのだろうかと思っていました。それはそれのようにそれを行うにはいたずらなようです:) –

答えて

1

これはいかがですか?オブジェクトの作成が完了したら、インテントをブロードキャストします(たとえば、プライベートにする場合は、LocalBroadcastを使用できます)。

Serviceでは、上記のブロードキャストに登録し、受信したら次のタスクを実行します。

2

IntentServiceを使用してください:ここでは

は私が探しているものの非常にラフなイラストです。通常の使用では、受信した各Intentが順番に処理され、すでにバックグラウンドスレッドに入っているため、AsyncTaskでネットワークアクティビティを実行する必要はありません。簡単です。

Queueにあなたのものを置き、AsyncTaskのコールでonPostExecute()コールの結果として「次のことをする」コールが発生するようにしてください。

Queue<YourObject> unfinished = getQueue(); 
List<YourObject> finished = new LinkedList<YourObject>(); 
Handler handler = new Handler(){ 
    handleMessage(Message m){ 
    // Object populated! Start next? Blink lights? Whatever. 
    } 
} 

AsyncTask t = new AsyncTask<...>(handler) { 
    Handler h; 
    public AsyncTask<...>(Handler h) { 
    this.h = h; 
    } 

    protected V doInBackground(YourObject o) { 
    // Network stuff, populate the thing 
    return popualtedThing(); 
    } 

    protected V onPostExecute(YourObject o) { 
    h.sendMessage(Message.obtain(0,o); 
    } 
}.execute(); 
+0

私はあなたが質問を誤解したと思います。私はインテントまたはサービスの数を作成するつもりはありません。私はサービスからオブジェクトを作成する必要があります。 –

+0

'IntentService'実装は、OSによって提供されるものを拡張します。相互に邪魔されることなくオブジェクトを作成します。作成したオブジェクトを自由に送信できます。 – Argyle

+0

私はインテントを使用していない、私はオブジェクトを使用しています。 –

1

リスナーを使用します。バックグラウンド・サービスをオブジェクト・インスタンスのリスナーとして登録し、オブジェクト・インスタンスが存在する場合は、すべてのリスナーにコールバックするだけです。

関連する問題