Андроид убивает синглтон, чтобы освободить память? - PullRequest
0 голосов
/ 12 сентября 2018

У меня очень странная проблема, и ее трудно описать, поэтому, пожалуйста, внимательно прочитайте допущения перед ответом, чтобы избежать прыжков в то, что, как я уже знаю, не

1 - у меня есть приложение для Android, которое входит в систему с моего сервера
2 - после успешного входа в систему я создаю Singleton API , который будет использоваться всеми действиями для отправки запросов на сервер
3 - невозможно использовать приложение без логина
4 - во время входа в систему у меня очень чистое состояние

if(APIFacade.getInstance() != null){
startActivity(new Intent(this,MainActivity.class));
                        finish();

}else {/*error handling*/}

5 - во всем классе LoginActivity есть только один вызов метода startActivity, поэтому невозможно запустить MainActivity без проверки, является ли фасад нулевым
6 - невозможно установить APIFacade.INSTANCE на null после его создания

Но даже при всех этих условиях пользователи иногда получают NullPointerException на MainActivity, когда приложение пытается сделать первый вызов API после входа в систему

String url = APIFacade.getInstance().getProfilePicUrl(); //throws nullpointerexception on 5% of the times

Класс APIFacade выглядит так:

public class APIFacade {
 private static APIFacade INSTANCE = null;

  @WorkerThread
    public APIFacade(Object i, final boolean preLoad) {
        INSTANCE = this;
//other stuff
}

  public static APIFacade getInstance() {
        return INSTANCE;
    }
}

Я не могу воспроизвести проблему в среде разработки, поэтому я просто знаю, что это происходит из-за панели мониторинга сбоев на firebase ...

Я полагаю, что в моем коде нет утечек, которые могут привести к этой ситуации, поэтому единственная теория, которую я получил: Android очищает некоторые переменные из памяти, когда мое приложение становится фоновым ...

Я знаю, что Android, естественно, делает это для занятий, но для одиночек? и если да, что я могу сделать, чтобы решить это?

1 Ответ

0 голосов
/ 12 сентября 2018

Ну, я нашел ответ сам благодаря замечательной статье: https://medium.com/@davethomas_9528/please-dont-use-singletons-to-persist-state-on-android-7bac9bc78b29

Коротко:
Все говорят, что синглстон на андроиде привязан к жизни приложения, поэтому будет выпущен толькоесли приложение убито

ЭТО ИСТИНА

что вы не слышите, так это то, что SO может быть убито приложением без взаимодействия с пользователем (для освобождения памяти для приложений переднего плана) и в этом сценариикогда пользователь пытается вернуться к вашему приложению, оно перезапустится с последнего использованного действия, а не с действия запуска.

...