多くのオブジェクトを作成できるService
を作成したいと思います。各オブジェクトはインターネットに接続し、JSONデータと写真をダウンロードします。これは大変簡単ですが、一度に1つずつ実行する必要があります。つまり、最初のオブジェクトがアクションを完了するまで新しいオブジェクトを作成することはできません。オブジェクトがアクションを実行したことをどのように知ることができますか?
私のService
がオブジェクトがそのアクションを実行した時期を知る最良の方法は何ですか?
多くのオブジェクトを作成できるService
を作成したいと思います。各オブジェクトはインターネットに接続し、JSONデータと写真をダウンロードします。これは大変簡単ですが、一度に1つずつ実行する必要があります。つまり、最初のオブジェクトがアクションを完了するまで新しいオブジェクトを作成することはできません。オブジェクトがアクションを実行したことをどのように知ることができますか?
私のService
がオブジェクトがそのアクションを実行した時期を知る最良の方法は何ですか?
これはいかがですか?オブジェクトの作成が完了したら、インテントをブロードキャストします(たとえば、プライベートにする場合は、LocalBroadcast
を使用できます)。
Service
では、上記のブロードキャストに登録し、受信したら次のタスクを実行します。
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();
私はあなたが質問を誤解したと思います。私はインテントまたはサービスの数を作成するつもりはありません。私はサービスからオブジェクトを作成する必要があります。 –
'IntentService'実装は、OSによって提供されるものを拡張します。相互に邪魔されることなくオブジェクトを作成します。作成したオブジェクトを自由に送信できます。 – Argyle
私はインテントを使用していない、私はオブジェクトを使用しています。 –
リスナーを使用します。バックグラウンド・サービスをオブジェクト・インスタンスのリスナーとして登録し、オブジェクト・インスタンスが存在する場合は、すべてのリスナーにコールバックするだけです。
その他の制限はありますか?なぜあなたはオブジェクトインスタンスのサービスへの参照を保持できません(そして、オブジェクトがGCになるのではないかと思いますが)、そしてサービス終了時にメソッドを呼び出すのですか? – Luis
私はこれまでサービスでメソッドを呼び出していましたが、もっと良い方法があるのだろうかと思っていました。それはそれのようにそれを行うにはいたずらなようです:) –