2013-12-15 2 views
0

Я пытаюсь закодировать таймер для Android, но у меня возникают проблемы с обработчиком. Эта строка:Почему этот код бросает исключение NullPointerException?

handler.post(new Runnable(){ 

... вызывает исключение NullPointerException. Зачем?

public class HomeFragment extends Fragment { 

    private int stunde,minute,sekunde; 
    private TextView textfield; 
    private Button buttonStart,buttonStop; 
    private Handler handler; 
    private boolean Running = true; 
    private Runnable runnable; 
    private Thread thread; 



    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

     buttonStart =(Button) rootView.findViewById(R.id.button1); 
     buttonStop = (Button) rootView.findViewById(R.id.button2); 
     buttonStop.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       thread.stop(); 

      } 

     }); 
     textfield = (TextView) rootView.findViewById(R.id.startZeit); 





     buttonStart.setOnClickListener(new OnClickListener(){ 


      @Override 
      public void onClick(View v) { 
       Running = true; 
       runnable = new Runnable(){ 

        @Override 
        public void run() { 

         while(Running){ 
          try{ 

           Thread.sleep(1000); 
          } 
          catch(InterruptedException e){ 
           e.printStackTrace(); 
          } 
          handler.post(new Runnable(){ 


           @Override 
           public void run(){ 

            sekunde+=1; 


            if(sekunde == 60){ 
             minute +=1; 
             sekunde = 0; 
            }if(minute == 60){ 
             stunde +=1; 
            } 

            textfield.setText(String.format("%02d",stunde)+" : "+String.format("%02d", minute)+" : "+String.format("%02d",sekunde)); 



           } 


          }); 
         } 

        } 


       }; 
       thread = new Thread(runnable); 
      thread.start(); 
      handler = new Handler(); 



      } 

     }); 


     return rootView; 
    } 


}` 

ответ

0

Поскольку вы не инициализировали объект handler. Таким образом, вы получаете на нем NullPointerException.

Вам нужно будет сделать некоторые вещи, как это:

Handler handler = new Handler(); 

Где-то в вашем коде, прежде чем вы можете использовать этот объект.

+0

Я сделал это, под "thread.start();" -Я скажу, где именно мне нужно его инициализировать? – user3057253

+0

Просто переместите эту строку: handler = new Handler(); в другое место. Сделайте это прямо в начале onCreateView. Или еще лучше поместить его в метод onCreate. –

+0

Спасибо Emil, теперь он говорит мне java.lang.UnsupportedOperationException в thread.stop(); – user3057253

0

Ваш обработчик должен быть создан с

handler = new Handler(); 

перед тем она используется.

+0

Я сделал это, под "thread.start();" – user3057253

+0

В этом проблема. Вы должны это сделать раньше. – FWeigl

0

Ваше форматирование довольно сложно прочитать, но вы получаете NPE, если runnable или обработчик не были инициализированы. Поскольку вы предоставляете новый исполняемый объект, это означает, что ваш обработчик не был инициализирован.

Я думаю, что вы создаете свой обработчик внутри onClickListener. Попробуйте инициализировать его в onCreate или в верхней части onCreateView для ясности.

Goodluck

Смежные вопросы