2017-03-21 8 views
0

가 나는오류가 부울

E/AndroidRuntime: FATAL EXCEPTION 

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference at com.example.android.slidenerd180handler.MainActivity$MyThread.run(MainActivity.java:37) 

내가, 내가이 말했다 모든 것을했다가 작동하지 않는 이유는 확실하지 않다 무엇입니까 android.os.Handler.sendMessage 안드로이드 처리기에 대한 유튜브 튜토리얼 비디오,하지만 여전히 작동하지 않습니다.

라인 (37)이 오류는 null의 메시지를 보내려고한다는 것을 의미 handler.sendMessage(message);

class MyThread implements Runnable { 


    @Override 
    public void run() { 
     for(int i =0;i<100;i++){ 
      Message message = Message.obtain(); 
      message.arg1=i; 
      handler.sendMessage(message); 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
+0

선언하고 초기화 한 핸들러 객체를 초기화 했습니까? – HaroldSer

+0

완전한 예를 보여주십시오. 모든 변수 선언과 일치하는 중괄호를 표시해야합니다. –

+2

가능한 복제본 [안타깝게도 MyApp가 중지되었습니다. 어떻게 해결할 수 있습니까?] (http://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this) –

답변

0

입니다. 즉, 메시지가 비어 있습니다. 메시지를받는 위치를 확인하고 메시지가 null이 될 가능성이 없는지 확인하십시오.

메시지를 보내기 전에 if 문을 추가해야합니다. 코드를 다음으로 바꾸어보십시오.

class MyThread implements Runnable { 

@Override 
public void run() { 
    for(int i =0;i<100;i++){ 
     Message message = Message.obtain(); 
     if(message != null){ 
      message.arg1=i; 
      handler.sendMessage(message); 
     } 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

    } 

희망이 있습니다.

0

처리기가 초기화되기 전에 MyThread가 시작됩니다 (활동의 onCreate()로부터). MyThread가 실행되기 전에 핸들러를 초기화하십시오.

0

메시지를 보내기 전에 Handler이 초기화되었는지 확인하지 않으면 작동하지 않습니다.

메시지를 보내기 전에 몇 분 (2 밀리 초) 동안 스레드를 잠자기 상태로 만들 수 있습니다. 사실 UIThreadthread.start() 일 때 보조 스레드 (Runnable을 구현하는 스레드)가 시작됩니다.

run()있어서 시작의 루프 명령 handler.sendMessage(message)UIThread 읽을 수있는 명령 handler = new Handler() 전에 보조 스레드에 의해 실행된다.

항상 이런 식으로 발생하는지 확신 할 수 없으므로 Handler이 먼저 초기화되어야합니다. 보조 스레드의 run() 섹션에 Thread.sleep(100);을 넣을 수 있습니다.

+2

"Leave a like" 제발, 그것은 사이트의 목적을 비난하고있다. – Mixone