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.
求大神帮我理理逻辑,急!
NetworkOnMainThreadException
是在UI线程上操作网络IO
Only the original thread that created a view hierarchy can touch its views.
是在非UI线程上操作UI
。
这是完全两回事诶。 首先你这段代码显然是第二种情况。
Stocker.this.myHandler.sendMessage(msg);
这个handler
是在非UI线程上的,你进行了更新,当然会触发第二种错误。
你现在想在异步线程上进行IO操作,然后返回主线程上进行UI更新的话。
直接使用 (new myChildThread()).start()
myHandler
使用new Handler(Looper.getMainLooper());
Android能写成这样,给跪了。
adapter是事先设置好的,不用等到handler再设置,handler的作用是在异步处理完成后向ui线程发送消息的。你开头写的那堆没看明白。
另外TimeTask本身就是异步的,不知道你在线程里再跑一个TimeTask意义何在。
总之逻辑能写这么乱的网络请求我还是第一次见到,题主威武
这里给你写一个DEMO吧。用的是第三方网络框架android-async-http,你用其他也可以思路一样的,这个程序不完整,只是告诉你从网络访问到回掉是怎么一回事。
static final int STATUS_SUCCESS = 100;
AsyncHttpClientUtil.getInstance()
.post(url, params, new TextHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
//网络访问成功,
//1.将数据放进相应的ArrayList
//2.通过handler刷新ListView
//这里是异步的,所以要调用Handler通知UI线程刷新ListView或者刷新其他UI
handler.sendEmptyMessage(STATUS_SUCCESS);
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
//网络异常
//进行异常处理
}
@Override
public void onFinish() {
//网络访问完成,进行善后处理(刷新栏回弹,加载中的菊花隐藏等等)
}
});
Handler handler = new Handler(){
@Override
protected void handleMessage(Message msg) {
switch(msg.what) {
case STATUS_SUCCESS:
//成功,刷新UI线程 adapter事先要和listView绑定在一起,然后改adapter
adapter.notifyDataSetChanged();
}
}
}