1

在我的项目中,由于超出了 VM 预算,它不断崩溃。我使用的图片都非常小,但据说它们会不断填满虚拟机。我正在通过 eclipse 工作并注意到 2 个实例,它给了我以下错误。

这个 Handler 类应该是静态的,否则可能会发生泄漏 (com.quickreaction.BT_screen_menuButtons.2) BT_screen_menuButtons.java /BT_activity_root/src/com/quickreaction line 1091 Android Lint Problem

当我点击这两个链接时,这也是它带给我的源代码。

Handler downloadScreenDataHandler = new Handler(){ 
@Override public void handleMessage(Message msg){ 
if(JSONData.length() < 1){ 
hideProgress(); 
showAlert(getString(R.string.errorTitle), getString(R.string.errorDownloadingData)); 
}else{ 
parseScreenData(JSONData); 
} 
} 
};  

和..

private Handler buttonImageHandler = new Handler() { 
public void handleMessage(Message msg){ 
//BT_debugger.showIt(activityName + ":buttonImageHandler setting background image for        button."); 
//msg.what will equal the index of the button images array... 

//set the drawable... 
Drawable d; 

//we may need to round the image... 
if(buttonCornerRadius > 0){ 
d = buttonImages.get(msg.what); 

//we have a drawable, our rounding method needs a bitmap... 
Bitmap b = ((BitmapDrawable)d).getBitmap(); 
b = BT_viewUtilities.getRoundedImage(b, buttonCornerRadius); 

//convert it back to a drawable... 
d = new BitmapDrawable(b); 

}else{ 
d = buttonImages.get(msg.what); 
} 
buttonSquares.get(msg.what).setBackgroundDrawable(d); 
buttonSquares.get(msg.what).invalidate(); 

} };

我一直在阅读有关使处理程序静态或弱的堆栈溢出,但不知道如何。有任何想法吗

4

2 回答 2

1

Handler weak这些关于制作或的 lint 消息static通常可以被忽略。如果您正在创建一个Handler并在您的活动中存储对它的引用,那么当您的活动被销毁时,它Handler也会消失。这里没有泄漏。唯一可能发生泄漏的情况是,当您的活动消失时,消息队列中仍有一条消息Handler。但是,通常情况并非如此。

查看您的代码后,我得出结论,您不能创建您的Handler static(即:和内部类),因为它需要对其外部类(活动)的引用。此外,将其设为独立类(如 CommonsWare 的答案)也无济于事,因为在实例化独立类时需要传递对活动的引用,因此这无助于解决“泄漏" 要么(如果真的有的话)。它可能会让愚蠢的 LINT 警告消失:-)

如果您遇到内存问题,您应该使用 JHAT 或 MAT 之类的堆分析器并实际查看内存中的对象,然后再注意这些愚蠢的 lint 警告。

另请参阅此 Handler 类应该是静态的,否则可能会发生泄漏:final HandlerThis Handler 类应该是静态的,否则可能会发生泄漏:IncomingHandler

于 2013-07-02T15:37:10.543 回答
0

不要使用匿名内部类的实例(例如new Handler() {}),而是创建静态内部类(例如static class MyHandler extends Handler)或常规 Java 类(class MyHandler extends Handler)并使用它。

于 2013-07-02T14:57:52.543 回答