2011-11-15 5 views
0

AsyncTask 메서드 내에서 ProgressDialog을 실행할 수 없습니다. 그것은 나에게 다음과 같은 오류가 있습니다 :왜 AsyncTask의 doInBackground 메서드 내에서 ProgressDialog를 실행할 수 없습니까?

ERROR/AndroidRuntime(12986): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

을 그리고 오류 코드에서이 줄에 :

final ProgressDialog dialog = ProgressDialog.show(GalleryView.this, "Refresh", "Loading... please wait", true); 

어떤 도움이 많이 감사합니다.

답변

1

doinbackground가 UI 스레드에서 실행되지 않으므로 UI ​​요소를 만들 수 없습니다. AsyncTask를 실행하기 전에 진행 대화 상자를 작성해야합니다.

+0

좋아,이게 내가하려는 일이다. progressdialog를 코드 조각으로 실행하고 싶습니다. 코드가 끝나면 대화 상자를 닫고 AsyncTask를 호출하여 UI를 새로 고칩니다. 나는 이것을 성취 할 수 없다. –

1

AsyncTask 구성은 배경 및 UI 스레드 작업을 분리하는 것에 관한 것입니다. doInBrackground 안에 UI 스레드가 없으므로 UI ​​관련 논리를 전혀 수행 할 수 없습니다. UI 스레드에서 실행되는 메소드를 사용하면됩니다. 너의 특별한 경우를 생각하면 그런 곳은 onPreExecute 일 것이다.

3

onPreExecute 메서드에서 progressdialog를 표시하고 onPostExecute 메서드에서이를 취소 할 수 있습니다. 이 두 메서드는 UI 스레드에서 실행됩니다. doInBackGround 메서드는 다른 스레드에서 실행됩니다.

또 다른 가능성은 AsyncTask를 시작하기 전에 progressdialog를 표시하는 것입니다. 개인적으로 나는 onPreExecute와 onPostExecute를 사용할 수있는 옵션을 좋아합니다. 그런 다음 progressdialog가 AsyncTask에 제대로 연결됩니다.

1

ProgressDialog는 UI 코드이므로 이벤트 큐에서 발생해야합니다. AsyncTask는 이벤트 대기열에서 실행됩니다. 진행률 대화 상자를 다음과 같이 할 수 있습니다.

ProgressBar progressBar = activity.findViewById(progressBarID); 
progressBar.setIndeterminate(true) 
progressBar.setVisibility(View.VISIBLE); 
AsyncTask<Void, Void, Void> aTask = new AsyncTask<Void, Void, Void>(){ 
@Override 
    protected Void doInBackground(Void... arg0) { 
    //Do your operations here 
    return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
    progressBar.setVisibility(View.GONE); 
     //Wrap up anything here, like closing the popup. 
} 
}; 
aTask.execute((Void)null); 
+0

확인. 이제 새로운 항목으로 GalleryView를 새로 고칠 수 없습니다. onPreExecute에서 진행률 대화 상자를 호출하고 정상적으로 실행됩니다. doInBackground에서 Adapter를 GalleryView 용으로 업데이트하고 GalleryView 자체를 어댑터의 새 항목으로 업데이트하도록 처리기를 호출합니다. 그러나 갤러리에서 항목을 화면 밖으로 옮길 때만 갤러리가 새로 고쳐집니다. 어떤 도움이 필요합니까? –

+0

@AbhishekSharma 흠. 몇 가지 코드를 볼 수 있습니까? 어쩌면 새로운 질문을 시작할 수 있습니다. 그렇게하면 답을 알고있는 사람들을 유치 할 가능성이 커집니다. – heneryville

관련 문제