Intereting Posts

CalledFromWrongThreadException: только исходный поток, создавший иерархию представления, может касаться представлений

У меня есть проблема со следующей ошибкой в ​​Android:

CalledFromWrongThreadException ;: Только исходный поток, создавший иерархию представлений, может коснуться его представлений

Похоже, что когда я пытаюсь обновить Textview в своей деятельности, вызов для обновления TextView происходит из моей активности, но я все равно получаю вышеуказанную ошибку.

У меня это так:

OnCreate () – устанавливает кнопки и текстовое представление.

OnStateChange () – прослушиватель уведомлений о изменениях состояния, когда это получает уведомление, если Texttext Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text to Text Text Text Text Text – Text Text Text – Text Text,

Когда я получаю уведомление о новом тексте, я пытаюсь изменить TextView так:

((TextView)findViewById(R.id.title)).setText("Some Text"); 

Но я получаю вышеуказанную ошибку.

Из поиска в googling, кажется, я должен использовать обработчик для изменения TextView или, возможно, использовать AsyncTask?

Может ли кто-нибудь объяснить, какой из них лучше использовать и почему?

EDIT: ADDED CODE SNIPPETS:


  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 }}); } 

Solutions Collecting From Web of "CalledFromWrongThreadException: только исходный поток, создавший иерархию представления, может касаться представлений"

Похоже, вы ошиблись. Попробуйте использовать Handler для обновления графического интерфейса в правой ветке. См. Раздел Обработка дорогостоящих операций в примере с пользовательским интерфейсом от android.com. В основном вы бы byeSetup в Runnable и вызывают его с помощью экземпляра Handler .

 Handler refresh = new Handler(Looper.getMainLooper()); refresh.post(new Runnable() { public void run() { byeSetup(); } }); 

Для других просто замените byeSetup (); С вашими заявлениями или методами кода. ByeSetup () – это метод выборки. Надеюсь, это сэкономит ваше время.

Расширение ответа willcodejavaforfood для ясности и реализации …

Я получил это, чтобы работать, и ниже, как я это сделал. Я выполняю несколько потоков обработки в службе, поэтому другие решения, выполняемые в Activity, не работают, например runOnUiThread (new Runnable () {} …

Поместите это вверху своего класса обслуживания, чтобы он был доступен везде в этом классе:

 Handler handler; 

Поместите это в свой класс класса onCreate или что-то, что загружается на главную цепочку обслуживания

 handler= new Handler(Looper.getMainLooper()); 

Поместите это в свой дополнительный поток, чтобы «отправить назад» код, чтобы запустить в пользовательском интерфейсе или пользовательском интерфейсе службы (whatevers его вызвал):

 handler.post(new Runnable() { public void run() { playNext(); //or whatever method you want to call thats currently not working } }); 

Другой подход, на этот раз использование android.os.Message

У android.os.Handler определяется как поле внутри вашей деятельности:

 private final Handler myTextHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message stringMessage) { textView.append((String) stringMessage.obj); return true; } }); 

Затем загрузите его из другого потока следующим образом:

 Message stringMessage = Message.obtain(myTextHandler); stringMessage.obj = "Hello!"; stringMessage.sendToTarget();