2014-10-05 11 views
0

다음은 Android에서 진행 대화 상자에 대한 코드이며 다음 오류가 발생합니다 : android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 이 오류와 관련된 모든 이전 게시물을 보았지만이 오류를 수정할 수 없습니다.Android : 점점 더 많은 오류 "보기 계층 구조를 만든 원래 스레드 만보기를 터치 할 수 있습니다."

// Waiting screen 
    pleaseWaitdialog = ProgressDialog.show(PhoneBookListView.this, "Loading", "Please wait...", true); 
      new Thread(new Runnable() { 
        @Override 
        public void run() 
        { 
        Looper.prepare(); 
        // do the thing that takes a long time 
        LoadContactFromPhoneAndSim(); 
        PhoneBookListView.this.runOnUiThread(new Runnable() { 
         @Override 
         public void run() 
         { 
          pleaseWaitdialog.dismiss(); 
         } 
        }); 
        } 
       }).start(); 

아무 도움이됩니다. 감사합니다.

+1

왜 'Looper.prepare()'를 호출할까요? –

+0

나는 Looper.prepare()를 추가 한 오류를 제거하기 위해 또 다른 오류가 발생했습니다. –

+0

정확히 무엇을하고 있는지 알고있는 경우에만 Looper.prepare()를 호출해야합니다. 그렇지 않으면 이런 종류의 문제가 발생할 수 있습니다. – PearsonArtPhoto

답변

2

AsyncTask을 사용하는 것이 좋습니다. 이러한 종류의 작업이 더 쉽기 때문입니다. 일반적으로 백그라운드 스레드에서 복잡한 작업을 수행하고 UI 스레드에서만 UI를 업데이트하려고합니다.

new PhonebookLoader.execute(); 

그리고 사용자들이 진행 한 얼마나 알 수 있도록 진행 상황을 게시처럼,이 물건의 모든 종류의 작업을 수행 할 수 있습니다

public class PhonebookLoader extends AsyncTask<Void,Void,Void> { 

protected Void doInBackground(Void ... params) { 
    LoadContactFromPhoneAndSim(); 
    return void; 
} 

protected void onPostExecute(Void param) { 
    pleaseWaitdialog.dismiss(); 
} 
} 

이 클래스를 시작하려면, 당신은이 전화 로드가 완료되면 UI 스레드를 업데이트하십시오. AsyncTask는 친구입니다. 사용하십시오.

이 글에서는 PhonebookLoader가 아마도 데이터를로드하고 UI에 배치하고있는 것으로 생각합니다. 이 두 가지 작업을 분리하면 앱 응답 성이 향상되고 유지 관리가 더 쉬워집니다.

+0

감사합니다 ... @PearsonArtPhoto –