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 回答