Android SDK:处理程序导致某些设备崩溃

时间:2013-02-09 11:23:47

标签: java android android-asynctask handler

我有一个处理程序,用于在指定的间隔循环中显示图像,在到达最后一个图像时,它返回到第一个正确的图像。但是,我遇到了问题,因为它导致某些设备崩溃并使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);




          }  

         }

在onCreate()方法中调用上述AsyncTask。 其次,我有一个刷新按钮,可以重新下载这些图像,以便在它们定期更改时获取最新的图像。因此,我有一个附加到刷新按钮的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);


         }


     }

我认为处理程序设置不正确并导致性能问题。任何人都可以看到这个代码有什么问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

你需要在线程中使用处理程序时调用Looper.prepare()。在创建Runnable实例后编写 Looper.prepare()