android 消息处理 handler发消息的时候用sendMessage可以,用sendMessageDelayed就出错

左燈右行 2013-02-21 02:11:48

public class Looper01Activity extends Activity {

private TextView view;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.looper01);

view = (TextView)findViewById(R.id.lp_tv_view);
view.setText("0");

MyThread mt = new MyThread(view);
mt.start();
}

private class MyThread extends Thread{

private TextView v;
private Handler mh;

public MyThread(TextView v){
this.v = v;
}
@Override
public void run() {
super.run();
Looper.prepare();

mh = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
v.setText(msg.what + ""); //会在执行这句话的时候报错
//如果发消息时用的是sendMessage不报错,
//用sendMessageDelayed就会报错
}
};

Message msg = new Message();
msg.what = 3;
mh.sendMessage(msg);
// mh.sendMessageDelayed(msg, 1000); //如果这么发消息就会报错,
// 错误信息是 //android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

Looper.loop();
}

}
}



android不是子线程不能更新UI吗?为什么用sendMessage就可以啊,为什么用sedMessagedelayed发送消息就会报错呢?

...全文
670 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Runing-Bird 2015-08-12
  • 打赏
  • 举报
回复
你的handler是在子线程中定义的,所以其还是属于子线程,将new handler放到主线程中去定义
Runing-Bird 2015-08-12
  • 打赏
  • 举报
回复
你的handler是属于子线程的,相当于还是在子线程中修改UI了。只有在主线程中才可以去修改UI
freshui 2015-08-12
  • 打赏
  • 举报
回复
把主线程的loop给handler应该可以。 或者这个handler的定义放在MyThread类定义的外面即可。 内部类可以访问外部类的变量的。

80,351

社区成员

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

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