如何在UI线程中使用后台线程中的列表?

时间:2014-03-27 06:30:17

标签: android multithreading

我有一个非常长的列表,正在后台线程中。我想使用适配器中的列表在listview中填充它。列表完成后,我应该如何与UI线程进行通信.. 我使用下面的代码:

Thread t = new Thread(new Runnable() {
                public void run() {
                    getAllSaudaEntry();
                }
            });
            t.start();

adapter = new SimpleAdapter(getApplicationContext(), LongList,R.layout.sauda_row, from, to);
            listView.setAdapter(adapter);

public void getAllSaudaEntry(){
        db = dbh.getReadableDatabase();

map = new HashMap<String, String>();
.
.
.
LongList.add(map);

我听说过notifyDatasetChanged()。我在哪里使用它?

2 个答案:

答案 0 :(得分:2)

设置适配器后,您必须调用它。

 adapter = new SimpleAdapter(getApplicationContext(), LongList,R.layout.sauda_row, from, to);
 listView.setAdapter(adapter);
 adapter.notifyDatasetChanged();

答案 1 :(得分:1)

有几种方法可以做到这一点。但是,无论你做什么,都不要从工作线程中设置适配器。

1。 AsyncQueryHandler

如果您的数据位于内容提供商中,这可能是最简单的方法。它会为你完成所有肮脏的工作,并在完成后回复。看看你的代码,你似乎并没有使用内容提供商,但我想指出它是否完整&#39;清酒。 (作为旁注 - 您可能希望使用一个。我知道Android文档说如果您与其他应用程序共享数据,您真的只需要一个,但如果您不这样做,那么&# 39; ll会错过很多SDK的便利,例如Loader s。)

2。的AsyncTask

您还可以使用AsyncTask在不同的线程上执行繁重的工作(在doInBackground方法中),然后将填充的列表传递给onPostExecute以将其设置在列表中。 onPostExecute在UI线程上运行。

3。处理

将自定义Handler附加到UI线程。完成计算线程后,将消息从它传递给包含填充列表作为参数的Handler(其obj)。然后,您的处理程序可以解码消息,检索列表,并在适配器上进行设置。

这样做涉及以下步骤:

handler = new Handler(null, new Handler.Callback() {
    public void handleMessage(Message msg) {
        Map result = (Map) msg.obj;
        LongList.add(map);
        adapter(new SimpleAdapter(getApplicationContext(), LongList,R.layout.sauda_row, from, to);
        listView.setAdapter(adapter);
    }
}

然后在您的工作线程中,当您的计算完成后,请执行以下操作:

Message msg = handler.obtainMessage();
msg.obj = yourResultMap;
msg.sendToTarget();

你应该走哪条路?

如果我是你,我会选择AsyncTask。为什么?好吧,我的第一选择通常是AsyncQueryHandler,但如果您不使用内容提供商,这就是出局。这留下了Handler和AsyncTask。 Handler是一个功能强大的工具,但它最适合在工作线程和UI线程之间进行大量通信的情况。在您的情况下,您实际上只需要传递两条消息 - 隐式启动消息,然后是结果消息。这是AsyncTask的完美设置。

你可能想读的Javadocs: AsyncQueryHandler,AsyncTask,Handler,Message