关于内存泄漏和通用方法

sus*_*dlh 4 java generics static android memory-leaks

哪个更适合在我的应用中使用?

public class NetworkCheck {

    Context context;

    public NetworkCheck(Context context) {
        this.context=context;
    }

    public boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null;
    }
}

...    

if(new NetworkCheck(this).isNetworkConnected()){
    //statement
}
Run Code Online (Sandbox Code Playgroud)

对于上面的一个,我每次必须使用它的方法时都要创建堆内存.当它的作用域结束时它的堆内存将被销毁(意味着花括号结束)......

另外.

public class NetworkCheck {

    public static boolean isNetworkConnected(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null;
    }
}

...

if(NetworkCheck.isNetworkConnected(){
    //statement
}
Run Code Online (Sandbox Code Playgroud)

对于这个,我不必创建任何堆内存.我读了很多文章,人们都说创建一个静态变量,方法导致应用程序中的内存泄漏.

并请帮我创建getLocalData()以下方法的Genric .....

 public static <T> void saveLocalData(Context context, String key, T value) {
        SharedPreferences prefs = context.getSharedPreferences(
                "Qikqrup", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        if (value instanceof String)
            editor.putString(key, (String) value);
        else if (value instanceof Boolean)
            editor.putBoolean(key, (Boolean) value);
        else if (value instanceof Integer)
            editor.putInt(key, (Integer) value);
        editor.commit();
    }
Run Code Online (Sandbox Code Playgroud)

Joo*_*gen 5

第二种情况不能被打败,因为它是最严格的.

在第一种情况下,只要NetworkCheck对象存在,Context对象就会保持活动状态.还有第二个对象(NetworkCheck).

然而:

  • 它的使用是有限的,对象将迅速超出范围并被垃圾收集.因此,效果与我们周围的粒子和反粒子的自发创造一样显着.
  • 在其他情况下,构造函数和调用的分离,也许许多调用可能证明是有用的.

关于:

public static <T> void saveLocalData(Context context, String key, T value)
Run Code Online (Sandbox Code Playgroud)

没用,Object会更好.实际上null不会被捕获.通常,此函数具有部分域:并非所有类都可以.再次检索该值将是猜测工作.

使用运行时信息可能会.

public static <T> void saveLocalData(Context context, String key, Class<T> type, T value)
public static <T> T loadLocalData(Context context, String key, Class<T> type)
Run Code Online (Sandbox Code Playgroud)

Java有一个Serializable接口,也可以使用.

public static <T> void saveLocalData(Context context, String key, Serializable value)
Run Code Online (Sandbox Code Playgroud)

然后在存储时收到对象.您需要阅读有关该主题的内容.