首页 新闻 搜索 专区 学院

android 多线程,使用Handler操作主线程失败

0
悬赏园豆:10 [已解决问题] 解决于 2015-06-05 13:12

场景:android调用wcf时创建新线程进行调用wcf

完成后调用在主线程里声明的Handler进行主线程操作后报错

 

仿照网上的其它资料又看了一下没找到什么问题,第一次使用没找到问题出在哪里,求助...

 

 

EditText  edtest;

private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);

//viewPager.setCurrentItem(0);
edtest.setText("tttttt");
}
};

 

 

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}

try{

// 此处省略

View v = (View)view.getTag();
if (v== null)
return;
edtest = (EditText)v.findViewById(R.id.nameEt);

new Thread(){
public void run(){
new ServiceShell().Add(name,phoneNo,reason,false);
handler.handleMessage(handler.obtainMessage(0));
}
}.start();

}catch(Exception e){
}
}

 

 

错误的信息和没使用Handler的错误信息是一样的:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

澈澈的主页 澈澈 | 菜鸟二级 | 园豆:435
提问于:2015-06-04 16:27
< >
分享
最佳答案
0

你这个线程改成这样试试 new Thread(new Runnable(){

  public void run(){

  new ServiceShell().Add(name,phoneNo,reason,false);
      handler.handleMessage(handler.obtainMessage(0));

}

}).start();

收获园豆:10
zeroonec | 初学一级 |园豆:59 | 2015-06-04 19:19

试了一下还是不行,一样的错误,还有什么地方需要注意的么?

澈澈 | 园豆:435 (菜鸟二级) | 2015-06-05 10:37

@澈澈: 去掉这个试试,super.handleMessage(msg);

zeroonec | 园豆:59 (初学一级) | 2015-06-05 11:06

@Nice_cj_com: 还是不行呃,不明白问题出在哪里

澈澈 | 园豆:435 (菜鸟二级) | 2015-06-05 13:04

@Nice_cj_com: ok,问题解决了,查了一下你说的Runnable,修改了一下handler的回调

 

1,在主线程实例handler,并未重写handleMessage

2,在新线程内handler的使用修改为

handler.post(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(0);
}
});

 

成功执行主线程动作.

 

依然多谢

澈澈 | 园豆:435 (菜鸟二级) | 2015-06-05 13:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册