0

我有一个主活动 A,我在其中创建了一个后台线程来从数据库加载数据。加载完成后,我想更新可能已经显示在子活动 B 中的列表(如果用户同时导航到 B)。如果用户还没有导航到 B,这不是问题。

但是一旦 A 中的线程完成,如何更新 B 的列表呢?

B 是 A 的孩子。

谢谢,

4

2 回答 2

0

首先将列表设置为空。您可以将用户带到活动B。存储列表数据的内容并使用静态列表填充列表,当后台线程不完整时该列表为空。一旦从 db 加载完成,调用列表适配器的 notifydatasetchanged() 方法。

实现后台线程的一种简单方法是异步任务。您可以通过覆盖相应的方法来定义异步任务的不同阶段。

于 2012-11-24T06:18:05.150 回答
0

谢谢伊姆兰,

我通过在一个单独的类中创建一个 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>
于 2012-12-01T11:32:46.207 回答