여러 스레드를 만드는 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는() ... 모두 내가 상승 예외를 방지 할 수 있다면?
이 경우를 생각해보십시오 : 데이터를 가져옵니다. 이 데이터는 언제든지 바뀔 수 있습니다 (예 :'boolean').'boolean'이'true'이면'false'이고 아무 것도 일어나지 않고 사용자가이 활동을 사용할 수 있습니다 ("화면"). – Xeon