首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触视图

CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触视图
EN

Stack Overflow用户
提问于 2010-07-19 18:13:05
回答 6查看 54.4K关注 0票数 52

我在Android中遇到了以下错误:

CalledFromWrongThreadException;:只有创建视图层次结构的原始线程才能接触其视图

当我尝试在我的Activity中更新Textview时,这似乎会发生,更新TextView的调用来自我的Activity,但我仍然收到上述错误。

我把它写成这样:

onCreate() -sets up按钮和文本视图。

onStateChange() -一个侦听器,用于侦听有关状态更改的通知,如果更改了TextView以表示一些不同的文本,则会收到通知。

当我收到新文本的通知时,我会尝试这样更改TextView:

代码语言:javascript
复制
((TextView)findViewById(R.id.title)).setText("Some Text");

但是我得到了上面的错误。

从谷歌上看,似乎我应该使用一个处理程序来更改TextView,或者使用AsyncTask?

谁能解释一下使用哪一个更好?为什么?

编辑:添加代码片段:

代码语言:javascript
复制
     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  

            setContentView(R.layout.my);

            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);  

            ((TextView)findViewById(R.id.time)).setText("Hello Text");


            findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"));
                    startActivity(dialIntent);

                        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD));
                        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));       
                }
        });

     }

代码语言:javascript
复制
//CallBacks from running Service

private final ICallDialogActivity.Stub iCallDialogActivity = new ICallDialogActivity.Stub(){

@Override
public void onStateChanged(int callState)
                throws RemoteException {    
            switch(callState){
            case GlobalData.CALL_STATUS_IDLE:

                break;

            case GlobalData.CALL_STATUS_DISCONNECTING:
                byeSetup();
                break;
    } 

};

代码语言:javascript
复制
public void byeSetup(){

            ((TextView)findViewById(R.id.time)).setText("Bye Text");

            findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    //Void the Button
                }});
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-19 20:36:03

看起来你好像走错线了。尝试使用处理程序在正确的线程上更新GUI。请参阅android.com中的Handling Expensive Operations in the UI Thread示例。基本上,您会将byeSetup包装在Runnable中,并使用Handler实例调用它。

代码语言:javascript
复制
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
    public void run()
    {
        byeSetup();
    }
});
票数 82
EN

Stack Overflow用户

发布于 2017-11-13 17:15:01

当更改涉及到主线程(UiThread)时。在另一个线程中使用它可以更改任何视图。

代码语言:javascript
复制
runOnUiThread(new Runnable() {
    @Override
    public void run() {

      // TODO your Code 
        et_Pass.setText("");
    }
});
票数 6
EN

Stack Overflow用户

发布于 2015-01-07 11:17:29

扩展willcodejavaforfood食品的清晰和实现的答案……

我得到了这个工作,下面是我是如何做到的。我在一个服务中运行多个处理线程,因此在Activity中运行的其他解决方案不起作用,比如runOnUiThread(new Runnable() {}...

把它放在你的服务类的顶部,这样它在这个类中的任何地方都可以访问:

代码语言:javascript
复制
Handler handler;

将其放入您的服务类onCreate方法或服务主线程上加载的内容中

代码语言:javascript
复制
handler= new Handler(Looper.getMainLooper());

将此代码放入您的附加线程中,以便“回发”代码,以便在UI或服务UI (无论它叫什么)中运行:

代码语言:javascript
复制
handler.post(new Runnable() {
    public void run() {
        playNext(); //or whatever method you want to call thats currently not working
    }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3280141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档