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

У меня есть проблема со следующей ошибкой в 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
                }});
}
47
задан jww 6 October 2014 в 04:00
поделиться

1 ответ

Похоже, что вы находитесь в неправильном потоке. Попробуйте использовать обработчик для обновления 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();
    }
});
76
ответ дан 26 November 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: