0

3 つの異なるレイアウトを使用する Viewpager を作成しました。Listview のインデックス ページに続いて、画像とテキストのページが交互に表示されます。XML はすべて、必要に応じて Imageview、Listview、または Textview を含む LinearLayouts です。テキスト ページには、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)
4

0 に答える 0