2017-08-22 4 views
0

Warum gibt meine Async-Aufgabe null zurück? Es hat perfekt vorher funktioniert. Was mache ich falsch?Meine Asynctask gibt null zurück

Ich bin ein neuer Entwickler, ich habe nicht viel Wissen, wie man das behebt.

Hier ist mein Code.

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(); 
       } 

      } 
     }); 

Log Cat 08-22 September: 51: 04.279 11.359 bis 11.359/com.example.android.top10music E/Android Runtime: fatal EXCEPTION: main Prozess: com.example.android.top10music, PID: 11359 java.lang.NullPointerException: Versuch zum Aufruf virtuelle Methode 'Leere android.media.MediaPlayer.start()' auf einer null-Objekt Referenz bei com.example.android.top10music.NarutoActivity $ PlayAudioFileBg.onPostExecute (NarutoActivity.java:404) bei com.beispiel.android.top10music.NarutoActivity $ PlayAudioFileBg.onPostExecute (NarutoActivity.java:375) bei android.os.AsyncTask.finish (AsyncTask.java:632) bei android.os.AsyncTask.access $ 600 (AsyncTask. java: 177) bei android.os.AsyncTask $ InternalHandler.handleMessage (AsyncTask.java:645) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper .java: 135) bei android.app.ActivityThread.main (ActivityThread.java:5753) bei java.lang.reflect.Method.invoke (Mutter Methode) bei java.lang.reflect.Method.invoke (Methode .java: 372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1405) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1200)

+0

Bitte erläutern Sie im Detail, was Sie mit "meine asynchrone Aufgabe, die null zurückgibt" meinen. Eine 'AsyncTask' gibt nichts zurück. Wenn Sie meinen, dass 'doInBackground()' 'null' zurückgibt, überprüfen Sie LogCat, da Sie eine Ausnahme abfangen und den Stack-Trace dort protokollieren. – CommonsWare

+0

In Logcat suchen, sollten Sie eine Ausnahme finden. Oder setzen Haltepunkt in catch-Block und Druck e.getMessage() –

+0

posten Sie Ihre Log-Katze –

Antwort

0

Sie müssen beim Zugriff auf Variablen in verschiedenen Threads vorsichtig sein. Ändern Sie die mMediaPlayer Variable zu einem lokalen innerhalb der AsyncTask lieber als die Elternklasse zugreifen.

@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; 
    } 

Der Grund Code nicht der Fall funktioniert, dass, sobald Sie versuchen, eine Variable aus einer inneren Klasse zuzugreifen, die Variable final wird und daher in Ihrem onExecute Sie können nichts zuweisen. Das verursacht eine Ausnahme, die Sie abfangen und Ihren Code schließlich null zurückgeben.