Android で次のエラーが発生します。
CalledFromWrongThreadException;: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます
アクティビティで Textview を更新しようとすると発生するようですが、TextView を更新するための呼び出しはアクティビティ内からのものですが、それでも上記のエラーが発生します。
私はそれを次のように持っています:
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
}});
}