Пишу Android приложение с использованием таких библиотек:
У меня есть UI: Fragments
и Activities
и для каждого реализован Presenter
Зайдем в Presenter
(AuthActivity
), эта активность запускается в первую очередь, значит и её Presenter
тоже.
Здесь у нас вот такой код:
@InjectViewState
public class AuthPresenter extends MvpPresenter<AuthView> {
public RxSocket socket;
private AuthView view;
public AuthPresenter() {
socket = SingletonSocket.getInstance(); //Синглтон, код синглтона будет ниже
view = getViewState();
}
public void authServer(){
socket.connect()
.subscribe(() -> {
listenForErrors();
view.showAuthFragment();
}, throwable -> {
view.showErrorFragment(null);
throwable.printStackTrace();
});
}
private void listenForErrors(){
socket.on(Socket.EVENT_ERROR)
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(objects -> {
view.showError("Ошибка подключения");
view.showErrorFragment(null);
});
}
@Override
public void onDestroy() {
super.onDestroy();
socket.off(Socket.EVENT_ERROR);
}
}
RxSocket socket идет инициализация через синглтон:
public final class SingletonSocket {
private static RxSocket socket;
private SingletonSocket(){}
public static RxSocket getInstance(){
if(socket == null){
IO.Options options = new IO.Options();
options.transports = new String[]{"websocket"};
options.reconnection = false;
options.forceNew = false;
socket = new RxSocket(Constants.URL, options);
}
return socket;
}
}
Он нужен для одноразового коннекта.
Далее этот синглтон через конструктор Presenter
каждого Fragment
, чтобы потом из фрагментов получать нужные данные с сервера.
Я заметил, что когда я перехожу на вторую активность (при этом уничтожаю старую), и далее нажимаю физическую кнопку назад, то у меня все закрывается (Что правильно), но при повторном открытии из недавних приложений открывается первая активность. И при этом фрагмент уже не показывается (видимо синглтон выжил) Правильно ли это?
Это еще не все, с каждой сменой фрагмента память поднимается (методом replace)
FragmentTransaction transaction = getActivity().getFragmentManager().beginTransaction();
RegisterFirstFragment fragment = new RegisterFirstFragment(); //Здесь класс фрагмента, в который я хочу перейти
transaction.setCustomAnimations(R.animator.fragment_slide_left_anim, R.animator.fragment_slide_right_anim);
transaction.replace(R.id.fragment_container, fragment);
transaction.remove(this); //Здесь я пытался уничтожить фрагмент
transaction.commitAllowingStateLoss()
;
17мб -> 18мб -> 19мб -> 20мб и GG не собирает старые не нужные фрагменты.
Также у меня в каждом фрагменте есть SnackBar, который вызывается в случае неверных данный введенных пользователем и с каждым его вызовом у меня память увеличивается и не очищается. Не понимаю как в таком случае освобождать память?
Вопрос такой - является ли это повышение памяти нормальным, если нет, как в моем случае это можно исправить?
Статических переменных, которые хранят контекст у меня нет ни в одном классе.
Может быть проблема в синглтоне?
Как после нажатия кнопки назад на последней Activity
уничтожить и синглтон?
Заранее спасибо, за все предложенные решения и рекомендации(Например, если я что-то делаю не так, или нужен, также например, другой паттерн и т.д.).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Доброго времени сутокПодскажите где можно почитать про следующие записи, я просто внятной информации не нашел либо не совсем понял прочитанное
Иногда в одном TextView может быть несколько ссылокНо так как экран маловат, бывает не попадаешь на нужную