android 静态方法持有context的内存泄漏

handsome_pen 2017-08-01 11:10:44
最近在优化项目的时候,解决内存泄漏有点懵了。关于静态方法持有context的时候,但是又不能使用applicationContext的时候 ,比如方法里面有dialog的时候。
public class A{

public static a(Context context){
//.....

}
}

比如在这个时候context是activity传入的时候回造成内存泄漏吗?求大佬们帮助
...全文
1028 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 20 楼 u010668114 的回复:
这个的具体原因我暂时找不到,你自己可以搜一下输入法内存泄漏相关资料
好的 谢谢你了 我搜了下很多人也遇到这个问题 不过用网上的方法都不能解决 我再看看吧 谢谢你了
只为搞笑 2017-08-01
  • 打赏
  • 举报
回复
这个的具体原因我暂时找不到,你自己可以搜一下输入法内存泄漏相关资料
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 16 楼 u010668114 的回复:
这个内存泄漏是什么时候提示的呢,从activity1跳转到2的时候么,还是直接从activity1点击返回按钮后
是从1跳转到2的时候
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 17 楼 u013377714 的回复:
引用 14 楼 qq497930909 的回复:
[quote=引用 13 楼 u010668114 的回复:] 你这个是输入法的相关布局引用了界面的context导致的内存泄漏,并不是你这个dialog哦
我晕 我内存泄漏基本都是这个,原来是这样的啊,不过我没有用到输入法啊,整个布局就TextView和一个Button请帮我看看
DialogUtil.show(this)能放到onresume()方法里吗。。汗。。[/quote]刚刚试了一下 放到onResume中还是会有泄漏的提示啊
水的川 2017-08-01
  • 打赏
  • 举报
回复
引用 14 楼 qq497930909 的回复:
引用 13 楼 u010668114 的回复:
你这个是输入法的相关布局引用了界面的context导致的内存泄漏,并不是你这个dialog哦
我晕 我内存泄漏基本都是这个,原来是这样的啊,不过我没有用到输入法啊,整个布局就TextView和一个Button请帮我看看
DialogUtil.show(this)能放到onresume()方法里吗。。汗。。
只为搞笑 2017-08-01
  • 打赏
  • 举报
回复
这个内存泄漏是什么时候提示的呢,从activity1跳转到2的时候么,还是直接从activity1点击返回按钮后
RaleighLuo 2017-08-01
  • 打赏
  • 举报
回复
使用弱引用weakReference保存context,不占用资源,dialog泄露在ondestory判断dialog如果isShowing 就dismiss,关闭就不会泄露了
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 13 楼 u010668114 的回复:
你这个是输入法的相关布局引用了界面的context导致的内存泄漏,并不是你这个dialog哦
我晕 我内存泄漏基本都是这个,原来是这样的啊,不过我没有用到输入法啊,整个布局就TextView和一个Button请帮我看看
只为搞笑 2017-08-01
  • 打赏
  • 举报
回复
你这个是输入法的相关布局引用了界面的context导致的内存泄漏,并不是你这个dialog哦
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 7 楼 u013377714 的回复:
[quote=引用 6 楼 qq497930909 的回复:]
[quote=引用 3 楼 u013377714 的回复:]
[quote=引用 2 楼 qq497930909 的回复:]
[quote=引用 1 楼 qq_34364155 的回复:]
这样不会内存泄漏


最开始我就是这样想的,但是我这有个例子
public class DialogUtil {

public static void show(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("呵呵")
.setMessage("哈哈");
builder.create().show();
}

}

用leakcanary测出来还是内存泄漏啊 ,我就懵了- -[/quote]肯定会内存泄漏啊,静态方法要求变量也为静态,你传入context导致该activity不能被销毁,你这方法改成非静态啊。[/quote]
如果是这样的话,网上那些什么解决单例模式的内存泄漏方法都是不行的咯。比如:
public class DialogUtil {

private start DialogUtil instance;
private Context mContext;

private DialogUtil(Context context){
mContext=context;
}

public DialogUtil getInstance(Context context){
if(instance==null){
instance=new DialogUtil(context.getApplicationContext());
}
return instance;
}

public static void show(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setTitle("呵呵")
.setMessage("哈哈");
builder.create().show();
}

}
比如上面这个例子 ,我看到有很多都是这样解决的,如果照上面那样说,在getInstance中传的context也为静态,也会泄漏?[/quote]没有啊,方法名没有加static,不是静态啊。[/quote]

引用 8 楼 u010668114 的回复:
这样应该是不会内存泄露的,但是你没有持有这个dialog的引用,在界面关闭时没有调用dismiss好像会有警告。另外你可以贴一下你检测的leakcanary内存泄漏提示是什么
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 10 楼 ganshenml 的回复:
1.把LeakCanary内存泄漏的截图发出来看看;
2.上面的案例的写法是不会有错误的,对于Dialog传入的context应该是Activity这类,这个是没错的;
3.可以在界面销毁时去销毁dialog;
ganshenml 2017-08-01
  • 打赏
  • 举报
回复
1.把LeakCanary内存泄漏的截图发出来看看; 2.上面的案例的写法是不会有错误的,对于Dialog传入的context应该是Activity这类,这个是没错的; 3.可以在界面销毁时去销毁dialog;
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 7 楼 u013377714 的回复:
[quote=引用 6 楼 qq497930909 的回复:] [quote=引用 3 楼 u013377714 的回复:] [quote=引用 2 楼 qq497930909 的回复:] [quote=引用 1 楼 qq_34364155 的回复:] 这样不会内存泄漏
最开始我就是这样想的,但是我这有个例子 public class DialogUtil { public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 用leakcanary测出来还是内存泄漏啊 ,我就懵了- -[/quote]肯定会内存泄漏啊,静态方法要求变量也为静态,你传入context导致该activity不能被销毁,你这方法改成非静态啊。[/quote] 如果是这样的话,网上那些什么解决单例模式的内存泄漏方法都是不行的咯。比如: public class DialogUtil { private start DialogUtil instance; private Context mContext; private DialogUtil(Context context){ mContext=context; } public DialogUtil getInstance(Context context){ if(instance==null){ instance=new DialogUtil(context.getApplicationContext()); } return instance; } public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 比如上面这个例子 ,我看到有很多都是这样解决的,如果照上面那样说,在getInstance中传的context也为静态,也会泄漏?[/quote]没有啊,方法名没有加static,不是静态啊。[/quote] 不好意思 刚刚打掉了 getInstance是有static修饰的
只为搞笑 2017-08-01
  • 打赏
  • 举报
回复
这样应该是不会内存泄露的,但是你没有持有这个dialog的引用,在界面关闭时没有调用dismiss好像会有警告。另外你可以贴一下你检测的leakcanary内存泄漏提示是什么
水的川 2017-08-01
  • 打赏
  • 举报
回复
引用 6 楼 qq497930909 的回复:
[quote=引用 3 楼 u013377714 的回复:] [quote=引用 2 楼 qq497930909 的回复:] [quote=引用 1 楼 qq_34364155 的回复:] 这样不会内存泄漏
最开始我就是这样想的,但是我这有个例子 public class DialogUtil { public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 用leakcanary测出来还是内存泄漏啊 ,我就懵了- -[/quote]肯定会内存泄漏啊,静态方法要求变量也为静态,你传入context导致该activity不能被销毁,你这方法改成非静态啊。[/quote] 如果是这样的话,网上那些什么解决单例模式的内存泄漏方法都是不行的咯。比如: public class DialogUtil { private start DialogUtil instance; private Context mContext; private DialogUtil(Context context){ mContext=context; } public DialogUtil getInstance(Context context){ if(instance==null){ instance=new DialogUtil(context.getApplicationContext()); } return instance; } public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 比如上面这个例子 ,我看到有很多都是这样解决的,如果照上面那样说,在getInstance中传的context也为静态,也会泄漏?[/quote]没有啊,方法名没有加static,不是静态啊。
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 3 楼 u013377714 的回复:
[quote=引用 2 楼 qq497930909 的回复:] [quote=引用 1 楼 qq_34364155 的回复:] 这样不会内存泄漏
最开始我就是这样想的,但是我这有个例子 public class DialogUtil { public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 用leakcanary测出来还是内存泄漏啊 ,我就懵了- -[/quote]肯定会内存泄漏啊,静态方法要求变量也为静态,你传入context导致该activity不能被销毁,你这方法改成非静态啊。[/quote] 如果是这样的话,网上那些什么解决单例模式的内存泄漏方法都是不行的咯。比如: public class DialogUtil { private start DialogUtil instance; private Context mContext; private DialogUtil(Context context){ mContext=context; } public DialogUtil getInstance(Context context){ if(instance==null){ instance=new DialogUtil(context.getApplicationContext()); } return instance; } public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 比如上面这个例子 ,我看到有很多都是这样解决的,如果照上面那样说,在getInstance中传的context也为静态,也会泄漏?
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 4 楼 u013290250 的回复:
为什么要把这个方法写成静态的
这只是个例子,我实际项目中有个检测app版本的工具类,里有会有dialog。也会有其他的逻辑代码。
怀君 2017-08-01
  • 打赏
  • 举报
回复
为什么要把这个方法写成静态的
水的川 2017-08-01
  • 打赏
  • 举报
回复
引用 2 楼 qq497930909 的回复:
[quote=引用 1 楼 qq_34364155 的回复:] 这样不会内存泄漏
最开始我就是这样想的,但是我这有个例子 public class DialogUtil { public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 用leakcanary测出来还是内存泄漏啊 ,我就懵了- -[/quote]肯定会内存泄漏啊,静态方法要求变量也为静态,你传入context导致该activity不能被销毁,你这方法改成非静态啊。
handsome_pen 2017-08-01
  • 打赏
  • 举报
回复
引用 1 楼 qq_34364155 的回复:
这样不会内存泄漏
最开始我就是这样想的,但是我这有个例子 public class DialogUtil { public static void show(Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context) .setTitle("呵呵") .setMessage("哈哈"); builder.create().show(); } } 用leakcanary测出来还是内存泄漏啊 ,我就懵了- -
加载更多回复(1)

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧