2016-12-08 5 views
0

Я использую приведенный ниже код в моем activity class:Android: Утечка памяти

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; 
     } 
    } 
} 
+0

потому что статические переменные присутствуют в области класса, а не внутри определенного объекта. Таким образом, даже если объект освобожден, статическая переменная занимает пространство в памяти – Vinodh

+0

Можете ли вы дать немного больше информации о том, почему вам нужен экземпляр действия в вашем классе обслуживания? –

+0

@Abhishek V. Мой код огромен. Прости. –

ответ

0

Это приведет к утечке памяти в качестве своего класса обслуживания работает в отдельном потоке и передавая статическую ссылку на вашу деятельность будет держать экземпляр в памяти, даже если деятельность уволена, а не сбор мусора, безопаснее способ сделать это передать ссылку вашей деятельности в качестве параметра вашей службы и хранить его в WeakReference что-то вроде этого

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 
     } 
    } 
} 

Если вам нужна ссылка активности для одного из его статических переменных вы можете передать его в намерении дополнительные функции, или вы хотите вызвать статическую функцию активности, широковещательный приемник будет лучшим выбором для выполнения является.

0

Если вы начинаете службу от деятельности и использовать некоторые данные деятельности в этой службе. Вы можете передать их в намерениях.

Intent intent = new Intent(this,MyService.class); 
    intent.putExtra("data", "some_value"); 
    startService(intent); 
Смежные вопросы