2017-08-22 21 views
0

なぜ私の非同期タスクがnullを返すのですか?以前は完全に機能していました。私は間違って何をしていますか?My Asynctaskがnullを返す

私は新しい開発者です。この問題を解決する方法はあまり知られていません。

ここに私のコードです。

private class PlayAudioFileBg extends AsyncTask<String, Object, MediaPlayer> { 

    @Override 
    protected MediaPlayer doInBackground(String... params) { 
     try { 
      mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

      mMediaPlayer.setDataSource(params[0]); 

      mMediaPlayer.prepare(); 

      return mMediaPlayer; 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(final MediaPlayer mediaPlayer) { 
     super.onPostExecute(mediaPlayer); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
      mSeekBar.setProgress(0, true); 
     }else{ 
      mSeekBar.setProgress(0); 
     } 
     mediaPlayer.start(); 
     mSeekBar.setEnabled(true); 
     mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       if(repeatTimes != 0){ 
        mediaPlayer.start(); 

       }else{ 
        releaseMediaPlayer(); 
       } 

      } 
     }); 

ログキャット8月22日09:51:04.279 11359から11359/com.example.android.top10music E/AndroidRuntime:致命的な例外:メイン プロセス:com.example.android.top10music、 PID:11359 のjava.lang.NullPointerException:試みは、仮想メソッドを呼び出すために com.example.android.top10music.NarutoActivity $ PlayAudioFileBg.onPostExecuteでnullオブジェクト参照 で '無効 android.media.MediaPlayer.start()'( NarutoActivity.java:404) at com.example.android.top10music.NarutoActivity $ PlayAudioFileBg.onPostExecute(NarutoActivity.java:375) at android.os.AsyncTask.finish(AsyncTask.java:632) android.os.AsyncTask.access $ 600(AsyncTask。 Javaの:177) android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:645)android.os.Looper.loopでandroid.os.Handler.dispatchMessage(Handler.java:102) で (ルーパーで.java:135) android.app.ActivityThread.main(ActivityThread.java:5753) at java.lang.reflect.Method.invoke(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method .javaファイル: com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1405)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200で )で372)

+0

"私の非同期タスクがnullを返す"ということを具体的に説明してください。 AsyncTaskは何も返さない。 'doInBackground()'が 'null'を返すことを意味するならば、例外をキャッチしてそこにスタックトレースを記録するので、LogCatをチェックしてください。 – CommonsWare

+0

logcatを見て、あなたは例外を見つける必要があります。またはcatchブロックと印刷e.getMessage内部に置くのブレークポイントは、() –

+0

は、ログの猫投稿 –

答えて

0

異なるスレッドで変数にアクセスする場合は、注意が必要です。親クラスにアクセスするのではなく変数をAsyncTask内のローカル変数に変更します。

@Override 
    protected MediaPlayer doInBackground(String... params) { 
     try { 

      MediaPlayer mMediaPlayer = new MediaPlayer(); 
      mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

      mMediaPlayer.setDataSource(params[0]); 

      mMediaPlayer.prepare(); 

      return mMediaPlayer; 
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 

     return null; 
    } 

あなたのコードが動作しない理由は、すぐにあなたが内部クラスから変数にアクセスしようとして、変数がfinalなるため、ごonExecuteにあなたがそれに何かを割り当てることができないということです。これにより、例外が発生し、最終的にコードがnullを返すようになります。