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)