Android 如何在UI线程中使用后台线程制作的列表?
我有一个非常长的名单,这是在后台线程。我想使用适配器中的列表在listview中填充它。列表完成后,我应该如何与UI线程通信。。 我使用的代码如下:Android 如何在UI线程中使用后台线程制作的列表?,android,multithreading,Android,Multithreading,我有一个非常长的名单,这是在后台线程。我想使用适配器中的列表在listview中填充它。列表完成后,我应该如何与UI线程通信。。 我使用的代码如下: Thread t = new Thread(new Runnable() { public void run() { getAllSaudaEntry(); } }); t.start(); ad
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线程。计算线程完成后,将一条消息从该处理程序传递给该处理程序,该处理程序包含作为参数的已填充列表(itsobj
)。然后,处理程序可以解码该消息,检索列表,并在适配器上进行设置
执行此操作包括以下步骤:
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线程。计算线程完成后,将一条消息从该处理程序传递给该处理程序,该处理程序包含作为参数的已填充列表(itsobj
)。然后,处理程序可以解码该消息,检索列表,并在适配器上进行设置
执行此操作包括以下步骤:
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中)