0

指定された間隔のループで画像を表示するために使用されるハンドラーがあります。最後の画像に到達すると、正しい最初の画像に戻ります。ただし、一部のデバイスがクラッシュし、CPU使用率が大幅に上昇するため、問題が発生しています。コードの何が問題になっているのでしょうか。

フラグメントの上部で次のようにインスタンス化します。

final public static Handler handler = new Handler();
boolean isRunning = false;

次に、AsyncTaskのonPostExecute部分に、次のコードがあります。

 @Override
         protected void onPostExecute(Void v) {

            if(!isRunning) {
             Runnable runnable = new Runnable() {

                @Override
                public void run() {



                    anImageView.setVisibility(View.VISIBLE);
                    isRunning = true;
                    counter++;

                    //imageDownloader.download(data.get(i).getImageURL(), anmageView);
                    if(TabsViewPagerFragmentActivity.theImages !=null && TabsViewPagerFragmentActivity.theImages.size() > 0){
                    Bitmap anImage = TabsViewPagerFragmentActivity.theImages.get(i);
                    anImageView.setImageBitmap(anImage);
                    }

                    i++;
                    if(i>TabsViewPagerFragmentActivity.theImages.size()-1)
                    {
                    i=0;    
                    }



                    handler.postDelayed(this, 1500); 
                }




             };
             handler.postDelayed(runnable, 0);




          }  

         }

上記のAsyncTaskは、onCreate()メソッド内で呼び出されます。次に、定期的に変更される最新の画像を取得するために、これらの画像を再ダウンロードする更新ボタンがあります。したがって、更新ボタンにonClick()イベントが付加されています。これも正常に機能しますが、次のコードが呼び出されます。

@Override
     protected void onPostExecute(Void v) {

         for(int i=0;i<data.size()-1;i++) {

            Bitmap anImage = getBitmapFromURL(data.get(i).getImageURL());
            theImagesRefreshed.add(anImage);

         }



         if(!isRunning) {
             Runnable runnable = new Runnable() {

                @Override
                public void run() {



                    anImageView.setVisibility(View.VISIBLE);
                    isRunning = true;
                    counter++;

                    //imageDownloader.download(data.get(i).getImageURL(), anImageView);
                    if(theImagesRefreshed !=null && theImagesRefreshed.size() > 0){
                    Bitmap anImage = theImagesRefreshed.get(i);
                    anImageView.setImageBitmap(anImage);
                    }

                    i++;
                    if(i>theImagesRefreshed.size()-1)
                    {
                    i=0;    
                    }



                    handler.postDelayed(this, 1500); 
                }




             };
             handler.postDelayed(runnable, 0);


         }


     }

ハンドラーが正しくセットアップされておらず、パフォーマンスの問題を引き起こしていると思います。誰かがこのコードに何か問題があるのを見ることができますか?

前もって感謝します!

4

1 に答える 1

0

スレッドでハンドラーを使用しているときにLooper.prepare()を呼び出す必要があります。したがって、Runnableのインスタンスを作成した後、Looper.prepare()を記述します。

于 2013-02-09T11:43:31.710 に答える