我的 Asynctask 返回 null

Posted

技术标签:

【中文标题】我的 Asynctask 返回 null【英文标题】:My Asynctask is returning null 【发布时间】:2018-01-31 01:27:30 【问题描述】:

为什么我的异步任务返回 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();
                

            
        );

原木猫 08-22 09:51:04.279 11359-11359/com.example.android.top10music E/AndroidRuntime: 致命异常: main 进程:com.example.android.top10music,PID:11359 java.lang.NullPointerException:尝试调用虚拟方法'void android.media.MediaPlayer.start()' 在空对象引用上 在 com.example.android.top10music.NarutoActivity$PlayAudioFileBg.onPostExecute(NarutoActivity.java:404) 在 com.example.android.top10music.NarutoActivity$PlayAudioFileBg.onPostExecute(NarutoActivity.java:375) 在 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.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5753) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

【问题讨论】:

请详细解释“我的异步任务返回 null”是什么意思。 AsyncTask 不会“返回”任何东西。如果您的意思是 doInBackground() 正在返回 null,请检查 LogCat,因为您正在捕获异常并在那里记录堆栈跟踪。 查看 logcat 内部,您应该会发现异常。或者在 catch 块中放置断点并打印 e.getMessage() 张贴你的日志猫 是的,doInBackground 方法返回 null 我的日志猫正在打印 NullPointerException mediaPlayer 在哪里定义为变量? 【参考方案1】:

在不同线程中访问变量时需要小心。将mMediaPlayer 变量更改为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 的异常。

【讨论】:

以上是关于我的 Asynctask 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask 不返回任何响应

AsyncTask 完成后关闭 Activity 并返回父 Activity

如何将变量从 AsyncTask 返回到 Android 中的 Google Map 活动

使用 AsyncTask 并将值返回给 UI 主线程

AsyncTask 运行时 Espresso 测试返回按钮

将参数传递给 AsyncTask,并返回结果