简体   繁体   English

我的Asynctask返回null

[英]My Asynctask is returning null

Why is my async task returning null? 为什么我的异步任务返回null? It was working perfectly before. 之前运行得非常好。 What am I doing wrong? 我究竟做错了什么?

I am a new developer, I don't have much knowledge how to fix this. 我是一名新开发人员,我对如何解决此问题并不了解。

Here is my 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 09:51:04.279 11359-11359/com.example.android.top10music E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.top10music, PID: 11359 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference at com.example.android.top10music.NarutoActivity$PlayAudioFileBg.onPostExecute(NarutoActivity.java:404) at com.example.android.top10music.NarutoActivity$PlayAudioFileBg.onPostExecute(NarutoActivity.java:375) at android.os.AsyncTask.finish(AsyncTask.java:632) at android.os.AsyncTask.access$600(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5753) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCall 日志猫08-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上的com.example.android.top10music.NarutoActivity $ PlayAudioFileBg.onPostExecute(NarutoActivity.java:404)上的空对象引用上调用虚拟方法'void android.media.MediaPlayer.start()'。 NarutoActivity $ PlayAudioFileBg.onPostExecute(NarutoActivity.java:375)在android.os.AsyncTask.finish(AsyncTask.java:632)在android.os.AsyncTask.access $ 600(AsyncTask.java:177)在android.os.AsyncTask $ android.os.Looper.loop(Looper.java:135)处android.os.Handler.dispatchMessage(Handler.java:102)处的InternalHandler.handleMessage(AsyncTask.java:645)android.app.ActivityThread.main(ActivityThread) .java:5753),位于java.lang.reflect.Method.invoke(本地方法),位于com.android.internal.os.ZygoteInit $ MethodAndArgsCall处的java.lang.reflect.Method.invoke(Method.java:372)处 er.run(ZygoteInit.java:1405) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) er.run(ZygoteInit.java:1405)位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)

You need to be careful when accessing variables in different threads. 在不同线程中访问变量时,请务必小心。 Change the mMediaPlayer variable to a local inside the AsyncTask rather than accessing the parent class. 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;
    }

The reason your code doesn't work is that as soon as you try to access a variable from an inner class, the variable becomes final and therefore, in your onExecute you cannot assign anything to it. 您的代码不起作用的原因是,当您尝试从内部类访问变量时,该变量将变为final变量,因此,在onExecute您无法为其分配任何内容。 This causes an exception which you catch and eventually makes your code return null. 这将导致您捕获的异常,并最终使您的代码返回null。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM