Android: утечка памяти
Я использую код ниже в моем 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;
}
}
}
2 ответа
Это приведет к утечке памяти, так как ваш класс обслуживания работает в отдельном потоке, и передача статической ссылки на ваше действие сохранит экземпляр в памяти, даже если действие прекращено и не собрано мусором, более безопасный способ сделать это - передать ссылка на вашу деятельность в качестве параметра к вашему сервису и сохранение его в слабой ссылке примерно так
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 intent = new Intent(this,MyService.class);
intent.putExtra("data", "some_value");
startService(intent);