android viewpager与媒体播放器,偶尔崩溃

时间:2012-12-21 00:10:44

标签: android nullpointerexception media-player android-viewpager

我创建了一个使用3种不同布局的Viewpager。 Listview索引页面,后面是图片和文本的交替页面。 XML都是LinearLayouts,包含适当的Imageview,Listview或Textview。文本页面中也可能包含MediaPlayer(如果数据库中有声音引用)。

我的问题是,当在页面中来回滚动(快速)时偶尔会发生崩溃。此时我总共只有5页,只有1页有声。最终会有21页,其中10页会有声音。我猜这里有些不整洁,我没有做适当的记忆清理工作?

我应该在哪里找到原因并修复它?似乎没有针对MediaPlayer的onDestroy方法。分配/释放媒体资源的最佳做法是什么(请记住,Viewpager似乎在任何特定时刻都在内存中保存3页。)

编辑以添加更多信息:带有声音文件的页面是第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)

0 个答案:

没有答案
相关问题