【问题标题】:Android: Memory LeakAndroid:内存泄漏
【发布时间】:2016-12-08 06:26:11
【问题描述】:

我在activity class 中使用以下代码:

public static Activity list_Addresses_Activity;

在我的onCreate 中,我使用了这个:

list_Addresses_Activity = this;

但它会引发如下错误:

Do not place Android context classes in static fields; this is a memory leak (and also breaks Instant Run)

我需要从static 使用它,因为我将在我的Service class 中使用它。

我的CloseActivies.class

public class CloseActivies {
    Activity a;
    Activity b;
    Activity c;

    protected void CLSActivities(Activity ListAddresses, Activity ListOrder, Activity SendReports) {
        a = ListAddresses;
        b = ListOrder;
        c = SendReports;
        if (ListAddressesActivity.FlagLiveAddress && a != null) {
            Log.e("ADASFSDAGWEG", "X");
            a.finish();
            ListAddressesActivity.FlagLiveAddress = false;
        }
        if (ListOrderActivity.FlagLiveOrder && b != null) {
            Log.e("ADASFSDAGWEG", "Y");
            b.finish();
            ListOrderActivity.FlagLiveOrder = false;
        }
        if (SendReportsActivity.FlagSendReport && c != null) {
            Log.e("ADASFSDAGWEG", "Z");
            c.finish();
            SendReportsActivity.FlagSendReport = false;
        }
    }

    protected void CLSActivities() {
        if (ListAddressesActivity.FlagLiveAddress && a != null) {
            Log.e("ADASFSDAGWEG", "X");
            a.finish();
            ListAddressesActivity.FlagLiveAddress = false;
        }
        if (ListOrderActivity.FlagLiveOrder && b != null) {
            Log.e("ADASFSDAGWEG", "Y");
            b.finish();
            ListOrderActivity.FlagLiveOrder = false;
        }
        if (SendReportsActivity.FlagSendReport && c != null) {
            Log.e("ADASFSDAGWEG", "Z");
            c.finish();
            SendReportsActivity.FlagSendReport = false;
        }
    }
}

【问题讨论】:

  • 因为静态变量存在于类区域而不是特定对象中。因此,即使对象被释放,静态变量也会占用内存空间
  • 您能否提供更多信息来说明为什么您的服务类中需要活动实例?
  • @Abhishek V 。我的代码很大。对不起。
  • @AbhishekV :我认为 Jo 想从服务中访问 Activity 的一些变量。
  • 我需要完成已打开的活动。我编辑了我的问题。

标签: android memory-leaks android-memory java-memory-leaks


【解决方案1】:

这将导致内存泄漏,因为您的服务类正在单独的线程上工作,并且将静态引用传递给您的活动将使实例保留在内存中,即使活动被解除而不是垃圾收集,这是一种更安全的方法将您的活动的引用作为参数传递给您的服务,并将其存储在类似这样的弱引用中

public class MyIntentService extends IntentService {

    private final WeakReference<Context> mContextWeakReference;

    public MyIntentService() {
        super("MyIntentService");
    }

    public static void startActionFoo(Context context) {
        mContextWeakReference = new WeakReference<>(context);
        Intent intent = new Intent(context, MyIntentService.class);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Context context = mContextWeakReference.get();
        if(context != null) {
            //do your work as since context is not null means
            //activity is still present and if activity is dismissed
            //context will come null 
        }
    }
}

如果您需要其静态变量之一的活动引用,您可以将其传递到 Intent Extras 中,或者您想调用活动的静态函数,广播接收器将是执行此操作的更好选择。

【讨论】:

    【解决方案2】:

    如果您从活动开始服务并在该服务中使用一些活动数据。您可以按意图传递它们。

        Intent intent = new Intent(this,MyService.class);
        intent.putExtra("data", "some_value");
        startService(intent);
    

    【讨论】: