我有一个主活动 A,我在其中创建了一个后台线程来从数据库加载数据。加载完成后,我想更新可能已经显示在子活动 B 中的列表(如果用户同时导航到 B)。如果用户还没有导航到 B,这不是问题。
但是一旦 A 中的线程完成,如何更新 B 的列表呢?
B 是 A 的孩子。
谢谢,
我有一个主活动 A,我在其中创建了一个后台线程来从数据库加载数据。加载完成后,我想更新可能已经显示在子活动 B 中的列表(如果用户同时导航到 B)。如果用户还没有导航到 B,这不是问题。
但是一旦 A 中的线程完成,如何更新 B 的列表呢?
B 是 A 的孩子。
谢谢,
首先将列表设置为空。您可以将用户带到活动B。存储列表数据的内容并使用静态列表填充列表,当后台线程不完整时该列表为空。一旦从 db 加载完成,调用列表适配器的 notifydatasetchanged() 方法。
实现后台线程的一种简单方法是异步任务。您可以通过覆盖相应的方法来定义异步任务的不同阶段。
谢谢伊姆兰,
我通过在一个单独的类中创建一个 IntentService 来处理它(内部类不工作),然后从 A 启动它。工作完成后,我从 B 的广播接收器正在侦听的 IntentService 发射一个广播。它最终会更新列表。
这是代码:
在 A 类中,只需在 for 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>