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);
Другие вопросы по тегам