我制作了一个使用 3 种不同布局的 Viewpager。一个 Listview 索引页,后面是图片和文本的交替页面。XML 都是包含适当的 Imageview、Listview 或 Textview 的 LinearLayouts。文本页面中也可能有一个 MediaPlayer(如果数据库中有对声音的引用)。
我的问题是在页面中来回滚动(快速)时偶尔会发生崩溃。此时我总共只有5页,只有1页有声音。最终会有 21 页,其中 10 页会有声音。我猜有一些不整洁的地方我没有做适当的内存清理?
我应该在哪里寻找原因并解决它?MediaPlayer 似乎没有 onDestroy 方法。分配/释放媒体资源的最佳做法是什么(请记住,Viewpager 似乎在任何给定时刻都在内存中保存 3 页)。
编辑以添加更多信息:带有声音文件的页面是第三个(即在中间),因此它可能与在滑动到最后一页或第一页时从内存中丢失后重新创建视图有关。我不必为了得到错误而播放声音。我想我可能已经把它缩小了一些——在从第 1 页到第 5 页再滑动 41 次之后(这意味着这是第 11 次重新创建页面),它就死了。这个应用程序的另一部分设置相同(只是一个不同的数据库表)并且也计入 41,即如果我在应用程序的这一部分滑动 40 次,然后转到应用程序的另一部分,它是致命的 41,它会因相同类型的错误而死。
ps/请客气,我使用 Android 才 3 个月,在此之前对 Java 或 OOP 了解不多。
错误代码是 mp.setOnCompletionListener:
public void setSoundUrl(Uri path) throws IOException {
mp = MediaPlayer.create(getContext(), path);
mp.setOnCompletionListener(this);
updateProgressBar();
}
先前的错误是 audioPlayer.setSoundUrl(path);
private AudioPlayer setUpSound(LinearLayout ll, Matcher matcher) {
AudioPlayer audioPlayer = new AudioPlayer(ll.getContext(),attrs);
int soundRes = getResources().getIdentifier(matcher.group(2).trim(), "raw", "com.example");
Uri path = Uri.parse("android.resource://com.example/" + soundRes);
try {
audioPlayer.setSoundUrl(path);
audioPlayer.setTitle(matcher.group(3).trim());
} catch (IOException e) {
e.printStackTrace();
}
return audioPlayer;
}
堆栈跟踪:
12-20 15:40:02.330: ERROR/AndroidRuntime(12321): FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.AudioPlayer.setSoundUrl(AudioPlayer.java:78)
at com.example.ShowBirdText.setUpSound(ShowBirdText.java:127)
at com.example.ShowBirdText.onCreateView(ShowBirdText.java:73)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1264)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
at android.support.v4.view.ViewPager$3.run(ViewPager.java:237)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3806)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)