【发布时间】:2011-03-17 20:18:47
【问题描述】:
我在 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
}});
}
【问题讨论】:
-
你在子类中吗? onStateChange 在哪里被覆盖?
-
嗨 Pentium10,它通过 AIDL 接口被覆盖并与服务通信,服务将收到一些更改的通知,然后将告诉 Activity 基于此更新其 TextView。我添加了代码 sn-ps 以更好地演示我正在尝试的内容,该错误似乎非常随机出现,并且在 Activity 处于前台和不在前台时都会出现。
标签: android handler android-asynctask