メインのアクティビティAがあり、dbからデータをロードするためのバックグラウンドスレッドを作成します。ロードが完了した後、子アクティビティBにすでに表示されている可能性のあるリストを更新したいと思います(ユーザーがその間にBに移動した場合)。ユーザーがまだBに移動していない場合は、問題ありません。
しかし、Aのスレッドが終了したら、Bのリストを更新するにはどうすればよいですか?
BはAの子です。
ありがとう、
メインのアクティビティAがあり、dbからデータをロードするためのバックグラウンドスレッドを作成します。ロードが完了した後、子アクティビティBにすでに表示されている可能性のあるリストを更新したいと思います(ユーザーがその間にBに移動した場合)。ユーザーがまだBに移動していない場合は、問題ありません。
しかし、Aのスレッドが終了したら、Bのリストを更新するにはどうすればよいですか?
BはAの子です。
ありがとう、
ありがとうイムラン、
別のクラス(内部クラスが機能していなかった)にIntentServiceを作成し、Aから開始することで処理しました。作業が完了したら、BのブロードキャストレシーバーがリッスンしているIntentServiceからBroadCastを起動します。最終的にリストを更新します。
コードは次のとおりです。
クラスAでは、ex OnCreate()のIntentServiceを開始するだけです。
Intent contactIntent = new Intent(this, ContactLoaderService.class);
startService(contactIntent);
(別のクラスで)次のようなIntentServiceを作成します。
public class ContactLoaderService extends IntentService {
public ContactLoaderService() {
super("ContactLoaderService");
}
@Override
protected void onHandleIntent(Intent arg0)
{
populateContacts();
Intent broadcastIntent = new Intent();
broadcastIntent.setAction(ContactsResponseReceiver.ACTION_RESP);
broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
sendBroadcast(broadcastIntent);
}
}
クラスBIで、次のようにリストを更新する内部クラスを作成します。
public class ContactsResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP = "com.a.b.c.ContactsLoaded";
@Override
public void onReceive(Context context, Intent intent) {
mCurrentAdapter.notifyDataSetChanged();
}
}
Bでは、受信機を登録することを忘れないでください。BのonCreate()メソッドの場合:
IntentFilter filter = new IntentFilter(ContactsResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ContactsResponseReceiver();
registerReceiver(receiver, filter);
そして、AndroidManifest.xmlの通常のサービスタグ
<service android:name="com.a.b.c.ContactLoaderService"> </service>
最初はリストを空に設定します。ユーザーをアクティビティBに移動できます。リストデータの内容を保存し、バックグラウンドスレッドが不完全な場合は空になる静的リストを使用してリストを埋めます。dbからのロードが完了すると、リストのアダプターのnotifydatasetchanged()メソッドが呼び出されます。
バックグラウンドスレッドを実装する簡単な方法は、非同期タスクです。対応するメソッドをオーバーライドすることにより、非同期タスクのさまざまなフェーズを定義できます。