Утечка памяти ли это? Как исправить?

135
15 декабря 2017, 02:59

Что использую?

Пишу Android приложение с использованием таких библиотек:

  • Мoxy (Для реализации архитектуры MVP)
  • RxJava (Для удобной работы с данными)
  • Socket.io (Конкретно моя реализация RxSocket под RxJava)
  • Ну и многие другие (ButterKnife и для тестов)

Что делаю?

У меня есть 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, чтобы потом из фрагментов получать нужные данные с сервера.

В чём проблема? №1

Я заметил, что когда я перехожу на вторую активность (при этом уничтожаю старую), и далее нажимаю физическую кнопку назад, то у меня все закрывается (Что правильно), но при повторном открытии из недавних приложений открывается первая активность. И при этом фрагмент уже не показывается (видимо синглтон выжил) Правильно ли это?

Это еще не все, с каждой сменой фрагмента память поднимается (методом 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 не собирает старые не нужные фрагменты.

В чём проблема? №2

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

Так в чем же дело?

Вопрос такой - является ли это повышение памяти нормальным, если нет, как в моем случае это можно исправить?

Общие вопросы

Статических переменных, которые хранят контекст у меня нет ни в одном классе. Может быть проблема в синглтоне? Как после нажатия кнопки назад на последней Activity уничтожить и синглтон?

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

READ ALSO
Работа с файлами. Назначение FileWriter PrintWriter

Работа с файлами. Назначение FileWriter PrintWriter

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

167
Как добавить ссылки в popupmenu

Как добавить ссылки в popupmenu

Иногда в одном TextView может быть несколько ссылокНо так как экран маловат, бывает не попадаешь на нужную

220
Вставка обектов в БД, Hibernate

Вставка обектов в БД, Hibernate

MySQLЕсть такая таблица, со связями многие к одному

177