我有一个处理程序,用于在指定的间隔循环中显示图像,在到达最后一个图像时,它返回到第一个正确的图像。但是,我遇到了问题,因为它导致某些设备崩溃并使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);
}
}
我认为处理程序设置不正确并导致性能问题。任何人都可以看到这个代码有什么问题吗?
提前致谢!
答案 0 :(得分:0)
你需要在线程中使用处理程序时调用Looper.prepare()。在创建Runnable实例后编写 Looper.prepare()