У меня есть проблема со следующей ошибкой в Android:
CalledFromWrongThreadException;: Только исходный поток, который создал иерархию представления, может коснуться своих представлений
Это, кажется, происходит, когда я пытаюсь обновить Textview в своем Действии, вызов для обновления TextView из моего Действия, но я все еще получаю вышеупомянутую ошибку.
У меня есть он как это:
onCreate () - устанавливает кнопки и текстовое представление.
onStateChange () - слушатель для уведомлений об изменениях состояния, когда это заставляет в уведомлении если изменения TextView говориться некоторый другой текст.
Когда я получаю уведомление о новом тексте, я пытаюсь изменить TextView как так:
((TextView)findViewById(R.id.title)).setText("Some Text");
Но я получаю вышеупомянутую Ошибку.
От поиска с помощью Google его кажется, что я должен использовать обработчик, чтобы изменить 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
}});
}
Похоже, что вы находитесь в неправильном потоке. Попробуйте использовать обработчик для обновления GUI в нужном потоке. Смотрите пример Handling Expensive Operations in the UI Thread с сайта android.com. По сути, вы должны обернуть byeSetup
в Runnable
и вызвать его с помощью Handler
.
Handler refresh = new Handler(Looper.getMainLooper());
refresh.post(new Runnable() {
public void run()
{
byeSetup();
}
});