子线程设置循环更新UI的Listview,实际只循环了一次?

bluehale 2017-10-08 03:31:11
请教各位
为定时更新ListView, 采用循环的方式取数据,实际测试发现只能运行一次,难道是我Looper.prepare和Looper.loop()使用错误吗?

Runnable getMessageTask = new Runnable() { //独立的Runnable
@Override
public synchronized void run() {
Looper.prepare();
//while (IOHelper.loopjudge() && (!stopThread)) {
MessageDB messagedb = new MessageDB(MainActivity.this);
List<MessageMain> messages = messagedb.getMessageByChatNO(account.getChatNO()); //取得数据
ArrayList<Map<String, String>> listMessages = setMessaageListToMap(messages);
Message msg = Message.obtain();
msg.obj = listMessages;
getMessageHandler.sendMessageDelayed(msg, 1000);
Looper.loop();
}};
另外,在Activity的Oncreate方法中,设置Handler并接收信息,更改UI,
new Thread(getMessageTask).start();
getMessageHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
i++;
String activityName = this.getClass().getSimpleName();
System.out.println(activityName + "niuanmata" + i);
try {

ArrayList<Map<String, String>> listMessages = (ArrayList<Map<String, String>>)msg.obj;
boolean listchange = true;

if (oldMessages.size() != 0) {
if (listMessages.size() == oldMessages.size()) {
for (int i = 0; i < listMessages.size(); i++) {
Map<String, String> oldmessage = (Map<String, String>) oldMessages.get(i);
Map<String, String> newmessage = (Map<String, String>) listMessages.get(i);
if ((oldmessage.get("mID") != newmessage.get("mID")) || (oldmessage.get("mainContent") != newmessage.get("mainContent")) || (oldmessage.get("deadLine") != newmessage.get("deadLine"))) {
break;
}
if (i == (listMessages.size() - 1)) {
listchange = false;
}
}
}
}
if (listchange) {
SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, listMessages, R.layout.layout_invites,
new String[]{"mID", "creater", "mainContent", "deadLine", "mtype", "createrLogo"},
new int[]{R.id.tv_list_type, R.id.tv_list_name, R.id.tv_list_inviteword, R.id.tv_list_invitedate, R.id.tv_list_inviteid, R.id.iv_list_logo});
lvMessage.setAdapter(adapter);
oldMessages = listMessages;
}
} catch (Exception e) {
Toast.makeText(MainActivity.this, "wrong: " + e.toString(), Toast.LENGTH_SHORT).show();
return;
}
}
};

实际运行就是ACITvity的时运行过一次,后面就不执行了,问题到底出在哪里呢?
...全文
172 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluehale 2017-10-10
  • 打赏
  • 举报
回复
找到原因了,误解了Looper的含义,以为Looper.prepare(),Looper.loop()之间程序循环执行,类似while ,其实不是,只是允许信息循环而已,里面如果要循环还是要自己处理。
江三木洛 2017-10-09
  • 打赏
  • 举报
回复
在哪里循环了,不就是只sendMessageDelayed被调用了一次?

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧