버그 해결: 프로젝트 타 임 스 이상 실행 "Looper. prepare () 라 고 부 르 지 않 은 thread 내 에서 handler 를 만 들 수 없습니다." - 노 노 "낙서" 기억

----------   노 노 는 기술 교류 블 로 그 를 배우 고 당신 과 교류 하 기 를 기대 합 니 다!    ----------
자세 한 내용 은 보 세 요:http://blog.csdn.net/sun_promise
bug: “Can't create handler inside thread that has not called Looper.prepare()”
1. 문제 설명
Android Studio 에서 프로젝트 타임 이상 실행:    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
2. 원인 분석
Can't create handler inside thread that has not called Looper.prepare()
하위 스 레 드 thread 에 handler 를 만 들 수 없고 Looper. prepare () 라 는 방법 이 없습니다.
분석: 실제 프로젝트 에 handler 를 만 들 었 습 니 다. 그런데 왜 하위 스 레 드 에 handler 를 만 들 었 습 니까?가장 큰 가능성 은 하위 스 레 드 에서 UI 작업 을 했 고 handler 에 넣 지 않 았 을 수도 있 습 니 다.그래서 운행 중 에 잘못 보고 한 거 야.메 인 스 레 드 는 시간 을 소모 하 는 작업 을 할 수 없고, 하위 스 레 드 에 서 는 UI 변경 작업 을 할 수 없습니다. 하위 스 레 드 는 handler 를 통 해 UI 변경 작업 을 할 수 있 습 니 다.
Note: 이러한 오 류 를 보고 하면 하위 스 레 드 에서 문제 코드 를 찾 습 니 다.일반 개발 도 구 는 어디 가 잘못된 지 알려 준다.세 심하게 하면 돼.
3. 사례 분석:
1) 항목 에서 다음 과 같이 잘못 보고 했다.
04-21 10:16:52.930  17728-18371/com.******.debug E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-1385
    Process: com.******.debug, PID: 17728
    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
            at android.os.Handler.<init>(Handler.java:200)
            at android.os.Handler.<init>(Handler.java:114)
            at android.widget.Toast$TN.<init>(Toast.java:338)
            at android.widget.Toast.<init>(Toast.java:100)
            at android.widget.Toast.makeText(Toast.java:249)
            at com.******.app.base.PromptManager.showShortToast(PromptManager.java:173)
            at com.******.app.utils.APKVersionUpdate$3.run(APKVersionUpdate.java:193)

2) 오류 신고 와 관련 된 코드:
(주: 문 제 를 설명 하기 위해 서 항목 의 모든 소스 코드 를 붙 이지 않 았 기 때문에 잘못된 위치 부분 만 붙 였 습 니 다)
new Thread() {
			@Override
			public void run() {
				try {
					//           ,
					final File file = getFileFromServer(url, updateProgress);
					sleep(2000);
					installApk(file);
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();
                    }
				} catch (Exception e) {
					//        UI   ,    

					//        
					 PromptManager.showShortToast(TextActivity.this,
                            "    !        ");
					 //            
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();                   
                    }
				}
			}
		}.start();

3) 수정 후의 코드:
하위 스 레 드 에서:
new Thread() {
			@Override
			public void run() {
				try {
					//           ,
					final File file = getFileFromServer(url, updateProgress);
					sleep(2000);
					installApk(file);
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();
                    }
				} catch (Exception e) {
					handler.sendEmptyMessage(0);
				}
			}
		}.start();

Handler 에서:
private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
            switch (msg.what){
                case 0:
					//  UI  
                    PromptManager.showShortToast(MinxinApplication
                                    .getInstance().getApplicationContext(),
                            "    !        ");
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();
                    }
                    break;           
                default:break;
            }
		};
	};

----------   노 노 는 기술 교류 블 로 그 를 배우 고 당신 과 교류 하 기 를 기대 합 니 다!    ----------
자세 한 내용 은 보 세 요:http://blog.csdn.net/sun_promise

좋은 웹페이지 즐겨찾기