[android] CalledFromWrongThreadException : 뷰 계층 구조를 만든 원래 스레드 만보기를 변경할 수 있습니다.


Answers

선명도 및 구현에 대한 willcodejavaforfood의 답변 확대 ...

나는 이것을 작동 시켰고, 아래는 내가 그것을 한 방법이다. runOnUiThread (new Runnable () {} ...)와 같이 Activity에서 실행되는 다른 솔루션이 작동하지 않도록 Service에서 여러 처리 스레드를 실행하고 있습니다.

이것을이 클래스의 모든 곳에 액세스 할 수 있도록 서비스 클래스 상단에 배치하십시오.

Handler handler;

이것을 서비스 클래스에 넣으십시오. 메소드 또는 서비스 메인 스레드에로드되는 메소드를 작성하십시오.

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

UI 또는 서비스 UI (호출 된 whatevers)에서 실행되도록 코드를 '게시'할 추가 스레드 안에 넣으십시오.

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

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



이 메소드는 활동 전용 이며 변경 사항이 주 스레드 ( UiThread )와 관련 될 때 더 좋습니다. 뷰를 변경하려면 다른 스레드 내부에서 사용하십시오.

runOnUiThread(new Runnable() {
    @Override
    public void run() {

      // TODO your Code 
        et_Pass.setText("");
    }
});



Related