0

タブレット用の音楽プレーヤーアプリを書いています

活動は 3 つのセクションとして考えることができます

画面の左側には、フォルダー間を移動するために使用されるリストビュー オブジェクトがあります。

画面の中央には、現在選択されているフォルダー内で見つかった曲のリストを含むリストビュー オブジェクトがあります。

画面の右側には再生コントロールが含まれています。

ユーザーがフォルダーに移動すると、中央の列に表示されるファイルのリストを再生できます。これは 95% 完璧に機能しています。

曲が完了すると、中央のリストビューの次の項目に移動し、これをリストまでスクロールして一番上に配置します。

これは何時間も完全に機能し、リストの一番上の項目は現在再生中の曲です。

ただし、中央のリストが再生中の曲と完全に同期していない場合があり、ほとんど再入力されたようになります。これは、アプリケーションがバックグラウンドで実行されている場合に発生する傾向があります。ただし、これは非常にまれであるため、原因が何であるかを突き止めることができませんでした.

曲リストを作成するコードは、フォルダー リストがトリガーされた後に呼び出されます。これにより、中央の列に値が入力され、曲のリストがメモリに保存されます。音楽プレーヤーはメモリから再生します。ただし、曲のリストが再作成された場合、メモリ内のリストは破棄され、確実に同期が維持されます。

誰か提案はありますか?まったく何か?アプリがフォーカスに戻ると、アクティビティが作成/再作成されることに関係していると確信していますが、なぜこれが毎回発生しないのですか?

編集: oncompletion リスナーでリストビューをスクロールするコードがあります。アプリが画面上でフォーカスされていない場合、曲は完了後に次の曲に移動しますが、リスト ビューはスクロールできますか? そうでない場合、なぜこの問題が断続的になるのですか?

アクティビティが作成されたら、次のようにします。

mp.setOnCompletionListener(これ);

これは、以下のコードに関連しています。

 public void onCompletion(MediaPlayer mp) {

                // check for repeat is ON or OFF
                if(isRepeat){
                    // repeat is on play same song again
                    playSong(currentSongIndex);
                } 
                else{
                    // no repeat or shuffle ON - play next song
                    if(currentSongIndex < (songsList.size() - 1)){
                        playSong(currentSongIndex + 1);
                        currentSongIndex = currentSongIndex + 1;
                        //filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
                        if (android.os.Build.VERSION.SDK_INT >= 11)
                        {
                            filelv.smoothScrollToPositionFromTop(currentSongIndex, 0); 
                        }
                        else if (android.os.Build.VERSION.SDK_INT >= 8)
                        {
                            int firstVisible = filelv.getFirstVisiblePosition();
                            int lastVisible = filelv.getLastVisiblePosition();
                            if (currentSongIndex < firstVisible)
                                filelv.smoothScrollToPosition(currentSongIndex);
                            else
                                filelv.smoothScrollToPosition(currentSongIndex + lastVisible - firstVisible - 2);
                        }
                        else
                        {
                            filelv.setSelectionFromTop(currentSongIndex, 0);
                        } 


                    }else{
                        // play first song
                        playSong(0);
                        currentSongIndex = 0;
                        filelv = (ListView)getActivity().findViewById(R.id.FileList);
                        //filelv.smoothScrollToPositionFromTop(currentSongIndex, 0);
                        if (android.os.Build.VERSION.SDK_INT >= 11)
                        {
                            filelv.smoothScrollToPositionFromTop(currentSongIndex, 0); 
                        }
                        else if (android.os.Build.VERSION.SDK_INT >= 8)
                        {
                            int firstVisible = filelv.getFirstVisiblePosition();
                            int lastVisible = filelv.getLastVisiblePosition();
                            if (currentSongIndex < firstVisible)
                                filelv.smoothScrollToPosition(currentSongIndex);
                            else
                                filelv.smoothScrollToPosition(currentSongIndex + lastVisible - firstVisible - 2);
                        }
                        else
                        {
                            filelv.setSelectionFromTop(currentSongIndex, 0);
                        } 
                    }
                }
            }

発生するもう 1 つのことは、アプリがまだサービスとして実行するように構成されていないことです。これが原因でしょうか?

4

1 に答える 1

1

このエラーは、コンテキスト エラーまたはスレッドの問題のように聞こえます。アプリがバックグラウンドにあり、不要になったときに Android がプロセスの 1 つを強制終了すると、非常に奇妙な動作が発生する可能性があります。これも、他のアプリのタイミングとメモリのために断続的に発生します。

初め

  • これが発生した場合、log cat に奇妙なログはありますか?

第二に

次に、コードを調べて、疑わしいものを探します。

  • リストの作成はどのように行われますか。
  • 他のスレッドを実行していますか?
  • 誰かがミドルリストへの参照を持っていますか?
  • どこかにぶら下がっcontext objectsていますか?

ついに

エラーを再現する手段がない場合、エラーを修正するのは非常に難しいため、エラーを強制的に修正する方法を見つけてください。のように:アプリをバックグラウンドで実行し、他の多くのアプリを開いてから、もう一度音楽プレーヤーに戻ります。これは問題のある方法で行うことができるため、自分で行う必要はありません。

それを再現する方法を見つけることができれば、原因が見つかるまでコードの削除を開始するだけです。

于 2012-08-25T18:18:44.697 に答える