当前位置: 首页 > 知识库问答 >
问题:

我的Asynctask返回null

羊舌涵涤
2023-03-14

为什么我的异步任务返回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 113 59-11359/com.example.android.top10Music E/AndroidRuntime:致命异常:主进程:com.example.android.top10Music,PID:11359java.lang.nullPointerException:尝试在com.example.android.top10Music处的narutoActivity$playaudioFileBG.onpostExecute处的null对象引用上调用虚拟方法“void android.media.media.media.start()”er.run(zygoteinit.java:1405),地址为com.android.internal.os.zygoteinit.main(zygoteinit.java:1200)

共有1个答案

孔鹤龄
2023-03-14

在不同线程中访问变量时需要小心。将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。

 类似资料:
  • 问题内容: 一个简单的问题:是否可以返回in的值? 然后在我的: 编辑:这是很久以前我不熟悉Java的地方问的,现在我对它有了更好的了解,我将做一个简短的总结: 异步任务的要点是该任务为,这意味着调用该任务后,该任务将在其自己的线程上开始运行。从asynctask返回一个值将毫无意义,因为原始的调用线程已经进行了其他工作(因此该任务是异步的)。 考虑时间:在某个时间点,你启动了一个将与主线程并行运

  • 问题内容: 如何从AsyncTask中获取数据?我的MainActivity正在调用触发AsyncTask的DataCall.getJSON函数,但是我不确定如何将数据返回到原始Activity。 调用DataCall的MainActivity应该返回一个字符串并将其保存在 数据通话: 问题答案: 对我来说,关键是创建一个名为URLWithParams的类或其他类,因为AsyncTask将只允许发

  • 问题内容: 我正在使用具有以下签名的类: 我正试图通过其他班级来称呼它: 但是在这里我得到这个错误: 为什么在Class扩展行中将我指定为第三个参数? 问题答案: 您可以通过对返回的AsyncTask调用AsyhncTask的get()方法来获得结果,但是当它等待获取结果时,它将把它从异步任务变成同步任务。 由于您的AsyncTask位于单独的类中,因此您可以创建一个接口类并在AsyncTask中

  • 我正试图在android工作室中建立一个非常基本的天气应用程序。我正在使用AsyncClass返回多个字符串。 正如您在代码中看到的,我使用了一个名为“wrapper”的类,用于存储字符串,这样我就可以返回一个类对象,并在AsyncTask的onPostExecute方法中使用它。我面临的问题是,当我测试应用程序时,所有返回的字符串都是未定义的(包装类的默认值)。这意味着没有在doInBackgr

  • 问题内容: 我有一些EditText,用户可以输入ftp地址,用户名,密码,端口和testConnection按钮。如果成功建立连接,它将返回布尔值true。 我正在重新编写代码以使用AsyncTasks执行各种ftp操作,但是,如果连接成功,如何传递布尔值? 还有我的AsyncTask 问题答案: 如果myMethod从onPostExecute内部代码调用,它将在UI线程上运行。否则,你需要通

  • 问题内容: 已更新:(请参见下文)我已经环顾了几天,却找不到直接的答案。有人说有可能说一些话来完成某些说不是。我对此感到疯狂。 我想要的只是让AsyncTaskTask向外部类显示进度条。为此,我传递了您在主类中看到的上下文。但是无论我尝试什么我都会得到。 工作代码示例表示赞赏。谢谢 顺便使用Android 2.2。 主要: AsyncClass.java 更新: 我有一个后续问题:使用上述代码,