2011-04-07 4 views
0

글쎄,이 작업을 시도하는 동안 다양한 오류가 발생했습니다. 나는 활동을 통해 시작된 스레드가있다. 스레드는 진행 대화 상자를 작성/표시하고이를 취소해야합니다.스레드에서 ProgressDialog를 표시 할 수 없습니다.

ProgressDialog를 직접 표시하려고하면 루퍼가 준비되지 않았다는 오류가 발생합니다. 나는 루퍼와 함께 그것을 찾았다 고 생각했다. 그러나 진행 대화 상자가 표시되도록 Looper.loop을 호출해야했습니다. 응용 프로그램이 나타나면 그 지점에서 응용 프로그램이 멈추지 않고 Looper.loop 호출을 계속 지나치지 않게됩니다.

나는 그것을 얻을 수 없어서 HandlerThread와 Handler를 사용하여 완전히 새로운 방식을 찾았다. HandlerThread를 만들고 시작합니다. 스레드에서 루퍼를 가져 와서 핸들러를 만듭니다. 내 ProgressDialog 또는 토스트가 전혀 표시되지 않습니다.

더 쉬운 방법이 있나요?

+0

여기에 코드를 게시 할 수 있습니까? – Vinay

답변

1

는 U가

을 가질 수 비동기 작업을 구현하기위한 쉬운 헬퍼 클래스는 실제로있다
private Handler stopProgressHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) {   
     setProgressBarIndeterminateVisibility(false); 
    } 
}; 
private Handler startProgressHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) {   
     setProgressBarIndeterminateVisibility(true); 
    } 
}; 

유 시작할 때 스레드가 progressbar를 시작하고 스레드가 완료된 후 u는 progressbar을 중지 할 수 있도록. 이것은 시작하고 ..이 솔루션 중 하나가 될 것입니다 중지 progressbar를 호출하는 데 도움이 될 것입니다

public void closeProgressbar(){ 
    //bluetoothconnector.onDestroy(); 
    stopProgressHandler.sendEmptyMessage(0); 
} 
public void openProgressbar(){ 
    //bluetoothconnector.onDestroy(); 
    startProgressHandler.sendEmptyMessage(0); 
} 

..

1

ProgressDialog에 대해서는 확실하지 않지만 UI 스레드에서 업데이트해야하는 Android의 모든 UI 관련 내용은 알고 있습니다. 당신이 (UI 스레드에있을 것입니다) 핸들러를 만들고 해당 사용하여 대화 상자를 만들 수 있습니다 또는 http://developer.android.com/reference/android/os/AsyncTask.html

:

Handler uiHandler; 
//Activity onCreate 
onCreate(...){ 
    uiHandler = new Handler(); 
} 

// Somewhere in your other thread, 
uiHandler.postRunnable(new Runnable(){ 
    @Override 
    public void run(){ 
     // Create or update dialog 
     ... 
    } 
}); 
+1

다른 방법은 runOnUiThread()를 사용하는 것입니다. http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29 –

0

마지막 대답은 잘못된 것입니다 ....

가 있어야한다 :

setProgressBarIndeterminateVisibility (Boolean.TRUE | Boolean.FALSE);