我有一个非常长的列表,正在后台线程中。我想使用适配器中的列表在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()。我在哪里使用它?
答案 0 :(得分:2)
设置适配器后,您必须调用它。
adapter = new SimpleAdapter(getApplicationContext(), LongList,R.layout.sauda_row, from, to);
listView.setAdapter(adapter);
adapter.notifyDatasetChanged();
答案 1 :(得分:1)
有几种方法可以做到这一点。但是,无论你做什么,都不要从工作线程中设置适配器。
如果您的数据位于内容提供商中,这可能是最简单的方法。它会为你完成所有肮脏的工作,并在完成后回复。看看你的代码,你似乎并没有使用内容提供商,但我想指出它是否完整&#39;清酒。 (作为旁注 - 您可能希望使用一个。我知道Android文档说如果您与其他应用程序共享数据,您真的只需要一个,但如果您不这样做,那么&# 39; ll会错过很多SDK的便利,例如Loader
s。)
您还可以使用AsyncTask
在不同的线程上执行繁重的工作(在doInBackground
方法中),然后将填充的列表传递给onPostExecute
以将其设置在列表中。 onPostExecute
在UI线程上运行。
将自定义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