onCreate()里面执行
HandlerThread mHandlerThread = new HandlerThread("NetWork");
mHandlerThread.start();
myHandler = new MyHandler(mHandlerThread.getLooper());
myHandler.postDelayed(new myChildThread(),100);
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle b = msg.getData();
String content = b.getString("init");
if (content.equals("finish")) {
if (GetData.stockInfo != null && GetData.stockInfo.size() > 0)
{
myDataAdapter=new DataAdapter();
mListView.setAdapter(myDataAdapter);
setListViewHeightBasedOnChildren(mListView);
myDataAdapter.notifyDataSetChanged();
}
}
}
}
class myChildThread implements Runnable {
@Override
public void run() {
GetData.initOpenCloseTime();
}
Timer timer = new Timer(false);
TimerTask task = new TimerTask() {
@Override
public void run() {
{
GetData.getDataFromWeb(mcontext);
Message msg = new Message();
Bundle b = new Bundle();
b.putString("init", "finish");
msg.setData(b);
Stocker.this.myHandler.sendMessage(msg);
}
}
};
java.util.Date time = new java.util.Date();
timer.schedule(task, time, 5000);
}
}
主要就是想实现不断通过网络取数据然后更新listview的功能,不是报NetworkOnMainThreadException,就是Only the original thread that created a view hierarchy can touch its views.
求大神帮我理理逻辑,急!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
Android能写成这样,给跪了。
adapter是事先设置好的,不用等到handler再设置,handler的作用是在异步处理完成后向ui线程发送消息的。你开头写的那堆没看明白。
另外TimeTask本身就是异步的,不知道你在线程里再跑一个TimeTask意义何在。
总之逻辑能写这么乱的网络请求我还是第一次见到,题主威武
这里给你写一个DEMO吧。用的是第三方网络框架android-async-http,你用其他也可以思路一样的,这个程序不完整,只是告诉你从网络访问到回掉是怎么一回事。
NetworkOnMainThreadException是在UI线程上操作网络IOOnly the original thread that created a view hierarchy can touch its views.是在非UI线程上操作UI。这是完全两回事诶。 首先你这段代码显然是第二种情况。
这个
handler是在非UI线程上的,你进行了更新,当然会触发第二种错误。你现在想在异步线程上进行IO操作,然后返回主线程上进行UI更新的话。
直接使用 (new myChildThread()).start()
myHandler使用new Handler(Looper.getMainLooper());