[英]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.