android - 由于 : This Handler class should be static or leaks might occur,我如何编写静态处理程序

标签 android

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

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

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

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(); 

} };

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

最佳答案

这些关于使 Handler weakstatic 的 lint 消息通常可以被忽略。如果您正在创建一个 Handler 并在您的 Activity 中存储对它的引用,那么当您的 Activity 被销毁时,Handler 也会消失。这里没有泄漏。唯一可能存在泄漏的情况是,当您的 Activity 消失时,该 Handler 的消息队列中仍有一条消息。然而,通常情况并非如此。

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

如果您遇到内存问题,您应该使用 JHAT 或 MAT 等堆分析器,并在关注这些愚蠢的 lint 警告之前实际查看内存中有哪些对象。

另见 This Handler class should be static or leaks might occur: final HandlerThis Handler class should be static or leaks might occur: IncomingHandler

关于android - 由于 : This Handler class should be static or leaks might occur,我如何编写静态处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17428876/

相关文章:

java - Android - 使用 DownloadManager 下载后启动 Intent

android - 如何在不包含 android 支持库的情况下使用 ADT r20 创建 n 个项目?

android - 禁用用户在 BottomSheet 上拖动

android - Google Play 游戏服务在我的应用程序中添加了不需要的权限(电话状态和身份)

java - 获取当前位置时尝试调用虚拟方法

android - Android 应用的 token 授权

android - Android电子市场-替换apk而不通知/强制用户更新

android - 如何在 android 中的处理程序上调用 removeCallbacks 或 removeCallbacksAndMessages 后再次启动处理程序

java - 使用 aSmack 客户端映射 Openfire 自定义插件

android - “Plugin with id ' com.android.application ' not found”