Don*_*rty 47 android handler android-asynctask
我在Android中遇到以下错误的问题:
CalledFromWrongThreadException;:只有创建视图层次结构的原始线程才能触及其视图
它似乎发生在我尝试更新我的Activity中的Textview时,更新TextView的调用来自我的Activity,但我仍然得到上述错误.
我喜欢这样:
onCreate() - 设置按钮和文本视图.
onStateChange() - 一个关于状态更改通知的侦听器,当收到通知时,如果将TextView更改为说一些不同的文本.
当我收到新文本的通知时,我尝试更改TextView,如下所示:
((TextView)findViewById(R.id.title)).setText("Some Text");
但是我得到了上面的错误.
从谷歌搜索它,似乎我应该使用处理程序来更改TextView或使用AsyncTask?
任何人都可以解释哪一个更好用,为什么?
编辑:新增代码片段:
     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));       
                }
        });
     }
//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;
    } 
};
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
                }});
}
wil*_*ood 76
看起来你是在错误的线程.尝试使用Handler更新右侧线程上的GUI.请参阅android.com 中的UI线程示例中的处理昂贵操作.基本上你想包byeSetup一个Runnable,并用调用它Handler的实例.
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
    public void run()
    {
        byeSetup();
    }
});
当更改涉及到主线程 ( UiThread ) 时。在另一个线程中使用它来更改任何视图。
runOnUiThread(new Runnable() {
    @Override
    public void run() {
      // TODO your Code 
        et_Pass.setText("");
    }
});
| 归档时间: | 
 | 
| 查看次数: | 45847 次 | 
| 最近记录: |