2012-05-17 1 views
0

여러 스레드를 만드는 Android 응용 프로그램이 있습니다. 일부 스레드는 스레드로부터 안전한 HttpClient를 사용하여 서버에서 데이터를 지속적으로 가져옵니다.다중 스레드 및 대화 상자에서 Android에서 예외 표시/해제

예 1 : 스레드 1 -> 서버에서 데이터를 받았으므로 이제 사용자에게 알리기 위해 Dialog를 표시해야합니다. 예제 2 : 스레드 2 -> (UI 스레드에서) 모달 표시 PendingDialog -> 스레드 2 시작 -> 서버에 데이터 게시 및 응답 확인 (UI 스레드가 아님) -> runOnUiThread() {dismissPendingDialog() ... }

은 기본적으로 내가 함께 스레드를 만드는거야 :

classRunnableInstance = new MyRunnable(...); 
classThreadInstance = new Thread(classRunnableInstance); 
classThreadInstance.start(); 

그리고 "가져 오는"스레드의 기본 구조 것은 : onPause()onResume() : 또한 내가 중지에 스레드를 시작하고

public void run() { 
    try { 
     while(shouldRun) { 
      SomeResultObj result = MyHttpClient.invokeSomeMethod(); 
      if(checkIfIMustInformUser(result)) { 
       inform(); 
      } 
      sleep(); 
     } 
    } 
    catch(IOException e) { 
     activityGivenInConstructor.showFetchingDataError(e); //show on UI-thread 
    } 
} 

protected void inform(final SomeResultObj result) { 
    activityGivenInConstructor.runOnUiThread(new Runnable() { 
     public void run() { 
      Dialog dialog = MyDialogUtils.create(context, messageId); 
      ... 
      dialog.show(); 
      //or pendingDialog.dismiss(); 
     } 
    }); 
    shouldRun = false; 
    return; 
} 

protected void sleep() { 
    try { 
     Thread.sleep(AppConstants.SLEEP_DELAY); 
    } 
    catch(InterruptedException e) { 
     shouldRun = false; 
    } 
} 

각기.

"한 번에 하나의 대화 상자 표시"가 성공적으로 처리됩니다. 사용자가 어떤 작업을 수행 할 때 문제가 발생합니다 - 예를 들어 :

  • 가 종료 응용 프로그램이 새로운 활동 홈으로
  • 로 이동
  • 이동 등

내가 대화 상자를 보여 (참고 :에 UI 스레드) WindowManager$BadTokenException 같은 예외 IllegalStateException가 때때로있다 MyActivity has leaked window

내가 확인할 수 있습니다 dialog.show() 전 :

if(!Thread.interrupted() && shouldRun && !activityGivenInConstructor.isFinishing()) 

그러나이 문제는 응용 프로그램 문제에서만 해결됩니다. 다른 경우에는 일부 예외가 발생합니다.

어떻게 구현해야합니까? 더 이상의 예외는 없을 것입니까? 그리고는이 체크/(! Thread.interrupted는() ... 모두 내가 상승 예외를 방지 할 수 있다면?

답변

0

을 내가 Andriod 버전 개발자 아니지만, 나는 몇 가지 UI 코딩을했다. 당신이 가지고있는 것들에서 판단 사용자가 현재있는 화면에서 모달 대화 상자를 표시 할 필요가없는 경우 프로그래밍 방식으로 처리하면 안됩니까? 더 구체적으로 checkIfIMustInformUser (result) 메서드 호출?

+0

이 경우를 생각해보십시오 : 데이터를 가져옵니다. 이 데이터는 언제든지 바뀔 수 있습니다 (예 :'boolean').'boolean'이'true'이면'false'이고 아무 것도 일어나지 않고 사용자가이 활동을 사용할 수 있습니다 ("화면"). – Xeon