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

Android 如何在UI线程中使用后台线程制作的列表?,android,multithreading,Android,Multithreading,我有一个非常长的名单,这是在后台线程。我想使用适配器中的列表在listview中填充它。列表完成后,我应该如何与UI线程通信。。 我使用的代码如下: Thread t = new Thread(new Runnable() { public void run() { getAllSaudaEntry(); } }); t.start(); ad

我有一个非常长的名单,这是在后台线程。我想使用适配器中的列表在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);
Thread t=新线程(new Runnable(){
公开募捐{
getAllSaudaintry();
}
});
t、 start();
adapter=new simpledapter(getApplicationContext(),LongList,R.layout.sauda_行,from,to);
setAdapter(适配器);
public void getallsaudaintry(){
db=dbh.getReadableDatabase();
map=新的HashMap();
.
.
.
添加(地图);

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

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

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

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

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

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

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

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

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

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

1.异步查询处理器 如果您的数据位于内容提供商中,这可能是最简单的方法。它会为您处理几乎所有的脏活,并在完成后返回回调。查看您的代码,您似乎没有使用内容提供商,但出于完整性的考虑,我想指出这一点。(顺便说一句,你可能会考虑使用它。我知道android文档说,如果你与其他应用程序共享数据,你只需要一个,但是如果你不这样做,你就会错过SDK的许多便利,比如
加载程序
s)

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

3.处理程序 将自定义
处理程序
附加到UI线程。计算线程完成后,将一条消息从该处理程序传递给该处理程序,该处理程序包含作为参数的已填充列表(its
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线程之间进行大量通信的地方。在你的情况下,你实际上,你只需要传递两条消息——隐式开始消息,然后是结果消息。这是异步任务的完美设置

您可能想阅读的Javadocs:
AsyncQueryHandler、AsyncTask、Handler、Message有几种方法可以做到这一点。不过,无论您做什么,都不要从工作线程设置适配器

1.异步查询处理器 如果您的数据位于内容提供商中,这可能是最简单的方法。它会为您处理几乎所有的脏活,并在完成后返回回调。查看您的代码,您似乎没有使用内容提供商,但出于完整性的考虑,我想指出这一点。(顺便说一句,你可能会考虑使用它。我知道android文档说,如果你与其他应用程序共享数据,你只需要一个,但是如果你不这样做,你就会错过SDK的许多便利,比如
加载程序
s)

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

3.处理程序 将自定义
处理程序
附加到UI线程。计算线程完成后,将一条消息从该处理程序传递给该处理程序,该处理程序包含作为参数的已填充列表(its
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线程之间进行大量通信的地方。在你的情况下,你实际上,你只需要传递两条消息——隐式开始消息,然后是结果消息。这是异步任务的完美设置

您可能想阅读的Javadocs:
AsyncQueryHandler、AsyncTask、Handler、Message有几种方法可以做到这一点。不过,无论您做什么,都不要从工作线程设置适配器

1.异步查询处理器 如果您的数据位于内容提供商中,这可能是最简单的方法。它会为您处理几乎所有的脏活,并在完成后返回回调。查看您的代码,您似乎没有使用内容提供商,但出于完整性的考虑,我想指出这一点。(顺便说一句,你可能会考虑使用它。我知道android文档说,如果你与其他应用程序共享数据,你只需要一个,但是如果你不这样做,你就会错过SDK的许多便利,比如
加载程序
s)

2.异步任务 您还可以使用
AsyncTask
在不同的线程上执行繁重的任务(在
doIn中)