android 请教各位大神一个用线程自动刷新 listview 的问题,在线等。急!! 线程listviewsimpleadapter 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TimerTask 定时器来做,不就可以了。 还是不行啊 是不是线程 的优先级要高于 simpleadapter 每次都是要线程结束后simpleadapter才会运行 能不能给出详细一点的方法啊 使用handler+线程动态刷新界面的一般顺序是这样的: 线程:更新数据,handler:刷新界面启用一个新的线程去获取远程服务器的数据,然后通知handler去跟新ListView我没有看到你在handler里面做了什么更新ListView的操作,你在里面加载数据是不正确的,加载数据应当放在Thread里面,你的代碼存在很多問題,特別是這句:handler.post(runnable);你通過延遲時間來等待數據的加載完成,這是很不科學的。可以参考成这样: Handler handler = new Handler() { public void handleMessage (Message msg) {//此方法在ui线程运行 switch(msg.what) { case MSG_SUCCESS: list.setAdapter(simpleAdapter); break; case MSG_FAILURE: break; } } };在Thread裏面更新數據:Runnable runnable = new Runnable() { @Override public void run() {//run()在新的线程中运行 final String urlPath = "http://et.huobi.com/staticet/ticker_btc_json.js"; String jsonString = getJsonContent.getJsonContent(urlPath); //解析string类型的json数据并返回类型为item的一个对象中 item item = JsonTools.getItem(jsonString); if(item!=null){ listItem.put("high",items.getHigh()); istItem.put("low",items.getLow()); listItem.put("last",items.getLast()); listItem.put("buy",items.getBuy()); listItem.put("sell",items.getSell()); listItems.add(listItem); } //将item对象返回到handler当中 handler.obtainMessage(MSG_SUCCESS,item).sendToTarget(); } };在onCerat中 SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.item, new String[] { "high", "low", "last","buy","sell" }, new int[] { R.id.high, R.id.low, R.id.last,R.id.buy,R.id.sell }); ListView list = (ListView) findViewById(R.id.listView1);具體細節你可以在調整調整。 我现在这样加 的还是不行 timer = new Timer(); timer.schedule(new RemindTask(), 3000); System.out.println("000"+items.getHigh());//用于调试 SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.item, new String[] { "high", "low", "last","buy","sell" }, new int[] { R.id.high, R.id.low, R.id.last,R.id.buy,R.id.sell }); ListView list = (ListView) findViewById(R.id.listView1); simpleAdapter.notifyDataSetChanged(); list.setAdapter(simpleAdapter); System.out.println("333"+items.getHigh());//用于调试 class RemindTask extends TimerTask { public void run() { handler.post(runnable); timer.cancel(); //Terminate the timer thread } }现在我用的System.out.println("333"+items.getHigh());//用于调试这个语句显示的还是333 LZ你数据传到handler中后没有进行刷新列表数据当然不出来了在handler中加上simpleAdapter.notifyDataSetChanged();在看下 回复#3 像你那样做还是不行啊 Handler handler = new Handler() { public void handleMessage (Message msg) {//此方法在ui线程运行 switch(msg.what) { case MSG_SUCCESS: items = (item)msg.obj; System.out.println("1111"+items.getHigh()); //simpleAdapter.notifyDataSetChanged(); list.setAdapter(simpleAdapter); break; case MSG_FAILURE: break; } } };这里的111都没有打印出来好像这里面的语句都没有执行啊 回复#3好像你没有调用Runnable 方法啊 我现在还是不能够刷新 急,求教下,android2.3以上如何实现电接听呢?在线等 android 离线地图开发求指导 Android程序第一次安装运行时,如何在新建数据库中加几条初始数据? 求助Android 的编译系统解析,snod 在哪定义的? 点击android桌面的应用程序图标 弹出列表 如何实现? 谢谢 求教android中创建的文件放在了哪里? Android在线音乐搜索实现方案 NullPointerException 的错误?? 安卓适配华为虚拟键的打开和隐藏问题 Listview点击弹出对话框,第二次失败 求解阿!!本人菜鸟一枚 谢谢啦 安卓中 实现类似美团外卖左右两个listview的效果
能不能给出详细一点的方法啊
线程:更新数据,handler:刷新界面
启用一个新的线程去获取远程服务器的数据,然后通知handler去跟新ListView
我没有看到你在handler里面做了什么更新ListView的操作,你在里面加载数据是不正确的,加载数据应当放在Thread里面,你的代碼存在很多問題,特別是這句:handler.post(runnable);你通過延遲時間來等待數據的加載完成,這是很不科學的。
可以参考成这样:
Handler handler = new Handler() {
public void handleMessage (Message msg) {//此方法在ui线程运行
switch(msg.what) {
case MSG_SUCCESS:
list.setAdapter(simpleAdapter);
break;
case MSG_FAILURE:
break;
}
}
};在Thread裏面更新數據:
Runnable runnable = new Runnable() {
@Override
public void run() {//run()在新的线程中运行
final String urlPath = "http://et.huobi.com/staticet/ticker_btc_json.js";
String jsonString = getJsonContent.getJsonContent(urlPath);
//解析string类型的json数据并返回类型为item的一个对象中
item item = JsonTools.getItem(jsonString);
if(item!=null){
listItem.put("high",items.getHigh());
istItem.put("low",items.getLow());
listItem.put("last",items.getLast());
listItem.put("buy",items.getBuy());
listItem.put("sell",items.getSell());
listItems.add(listItem);
}
//将item对象返回到handler当中
handler.obtainMessage(MSG_SUCCESS,item).sendToTarget(); }
};
在onCerat中
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
R.layout.item,
new String[] { "high", "low", "last","buy","sell" },
new int[] { R.id.high, R.id.low, R.id.last,R.id.buy,R.id.sell });
ListView list = (ListView) findViewById(R.id.listView1);
具體細節你可以在調整調整。
timer.schedule(new RemindTask(), 3000);
System.out.println("000"+items.getHigh());//用于调试
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
R.layout.item,
new String[] { "high", "low", "last","buy","sell" },
new int[] { R.id.high, R.id.low, R.id.last,R.id.buy,R.id.sell });
ListView list = (ListView) findViewById(R.id.listView1);
simpleAdapter.notifyDataSetChanged();
list.setAdapter(simpleAdapter);
System.out.println("333"+items.getHigh());//用于调试
class RemindTask extends TimerTask {
public void run() {
handler.post(runnable);
timer.cancel(); //Terminate the timer thread
}
}
现在我用的
System.out.println("333"+items.getHigh());//用于调试
这个语句显示的还是333
在handler中加上simpleAdapter.notifyDataSetChanged();在看下
像你那样做还是不行啊 Handler handler = new Handler() {
public void handleMessage (Message msg) {//此方法在ui线程运行
switch(msg.what) {
case MSG_SUCCESS:
items = (item)msg.obj;
System.out.println("1111"+items.getHigh());
//simpleAdapter.notifyDataSetChanged();
list.setAdapter(simpleAdapter);
break;
case MSG_FAILURE:
break;
}
}
};
这里的111都没有打印出来
好像这里面的语句都没有执行啊
好像你没有调用Runnable 方法啊 我现在还是不能够刷新