2016-12-30 4 views
1

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

У меня есть работоспособный, который запускается, когда onCreate() вызывается в метод:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //Set all app specific starting points here 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_avatar); 
    ... 
    soundMeterLoop(); 
} 

public void soundMeterLoop() { 
    Log.d("SpeechKit", "Start Sound Meter"); 
    soundMeterHandler = new Handler(); 
    soundMeterRunnable = new Runnable() { 
     @Override 
     public void run() { 
      if(!soundMeter.SoundMeterRunning) { 
       Log.d("SpeechKit", "Start SoundMeter in the runnable"); 
       startSoundMeter(); 
      } 
      if (soundMeter.mMediaRecorder != null) { 
       amplitude = soundMeter.getAmplitude(); 
       decibelLevelOutput.setText("" + amplitude); 
       if (amplitude > threshold) { 
        decibelLevelOutput.setTextColor(Color.RED); 
        Log.d("SpeechKit", "Interrupt and run startNuance()"); 
        startNuance(); 
       } else { 
        decibelLevelOutput.setTextColor(Color.BLACK); 
        Log.d("SpeechKit", "Running"); 
        soundMeterHandler.postDelayed(this, 100); 
       } 
      } 

     } 
    }; 
    soundMeterHandler.postDelayed(soundMeterRunnable, 100); 
} 

Это работает просто отлично, когда он создал в onCreate. Как вы можете видеть, он убивает себя (не обновляя цикл, если заявление не работает) и запускает startNuance().

public void startNuance() { 
    soundMeterHandler.removeCallbacksAndMessages(soundMeterRunnable); 
    nuance.toggleReco(); 
} 

Затем я убиваю runnable и запускаю метод в другом классе. Этот класс работает нормально, а затем, когда он закончил делать свое дело, я перезвоню к этому основному классу с avatar.stopNuance();

Это в классе Nuance.java

@Override 
    public void onFinishedRecording(Transaction transaction) { 
     Log.d("SpeechKit", "onFinishedRecording"); 
     //We have finished recording the users voice. 
     //We should update our state and stop polling their volume. 
     state = State.PROCESSING; 
     stopAudioLevelPoll(); 
     avatar.stopNuance(); // <<<<< 
    } 

Затем он возвращается к моей основной деятельности (avatar) и работает этот метод stopNuance():

public void stopNuance() { 
    Log.d("SpeechKit", "stopNuance(), start loop again"); 
    soundMeterLoop(); 
} 

Затем он пытается выполнить ту же петлю из ранее. Только на этот раз я получаю много ошибок, относящихся к nullpointer excceptions. в частности, начиная с decibelLevelOutput.setText("" + amplitude);

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

+0

что тип переменной 'nuance'? я также переименовал бы 'avatar' в' avatarActivity', поэтому более очевидно, что вы общаетесь с – Blundell

+0

. 'nuance' ссылается на класс' Nuance'. Это хороший звонок на аватаре. Активация – ntgCleaner

ответ

1

После разговора на чат фактического выпуска был в другом месте в коде.

Проблема заключалась в следующем:

public class Nuance { 

     private Activity activity; 
     private Session session; 
     public Avatar avatarActivity = new Avatar(); // DONT DO THIS 

.... 

     @Override 
     public void onFinishedRecording(Transaction transaction) { 
      Log.d("SpeechKit", "onFinishedRecording"); 
      //We have finished recording the users voice. 
       //We should update our state and stop polling their volume. 
       state = State.PROCESSING; 
       stopAudioLevelPoll(); 
      avatarActivity.stopNuance(); 
      } 

Вы должны никогда, никогда никогда не создать свой собственный экземпляр деятельности. Они строятся и управляются системой. Система вызовет методы жизненного цикла экземпляра (onCreate и т. Д.), Но если вы создадите экземпляр, эти методы не будут вызваны - поэтому происходит много странного поведения.

Исправление здесь заключается в следующем:

public class Nuance { 

     private Avatar activity; 
     private Session session; 

.... 

     @Override 
     public void onFinishedRecording(Transaction transaction) { 
      Log.d("SpeechKit", "onFinishedRecording"); 
      //We have finished recording the users voice. 
       //We should update our state and stop polling their volume. 
       state = State.PROCESSING; 
       stopAudioLevelPoll(); 
       activity.stopNuance(); 
      } 
+0

Огромное вам спасибо за это! Вы спасли меня, наверное, дней исследований! Спасибо за урок. Учитесь каждый день! – ntgCleaner

0

Вы не хотите создавать новую runnable каждый раз, когда вызывается soundMeterLoop().

Попробуйте это:

private final Handler soundMeterHandler = new Handler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //Set all app specific starting points here 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_avatar); 
    ... 
    soundMeterLoop(); 
} 

public void soundMeterLoop() { 
    Log.d("SpeechKit", "Start Sound Meter"); 
    soundMeterHandler.postDelayed(soundMeterRunnable, 100); 
} 

private final Runnable soundMeterRunnable = new Runnable() { 
     @Override 
     public void run() { 
      if(!soundMeter.SoundMeterRunning) { 
       Log.d("SpeechKit", "Start SoundMeter in the runnable"); 
       startSoundMeter(); 
      } 
      if (soundMeter.mMediaRecorder != null) { 
       amplitude = soundMeter.getAmplitude(); 
       decibelLevelOutput.setText("" + amplitude); 
       if (amplitude > threshold) { 
        decibelLevelOutput.setTextColor(Color.RED); 
        Log.d("SpeechKit", "Interrupt and run startNuance()"); 
        startNuance(); 
       } else { 
        decibelLevelOutput.setTextColor(Color.BLACK); 
        Log.d("SpeechKit", "Running"); 
        soundMeterHandler.postDelayed(this, 100); 
       } 
      } 

     } 
    }; 
+0

@ntgCleaner. Я действительно хочу, чтобы это работало сейчас! haha – Blundell

+0

Хахаха спасибо! Я тестирую это прямо сейчас – ntgCleaner

+0

Я получаю сообщение «RuntimeException» «Невозможно запустить активность», а также «java.lang.NullPointerException: попытка вызвать виртуальный метод». из-за звука soundMeterHandler.postDelayed (soundMeterRunnable, 100); 'У меня нет обработчика, я предполагаю, что – ntgCleaner

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