@PowerFull

Из-за чего зависает приложение при работе с фрагментами?

Добрый день. Что делаем: на старте активити добавляем фрагмент

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        switch (c) {
            case (0):
                fragmentTransaction.add(R.id.frame, new Fragment1());
                break;
            case (1):
                fragmentTransaction.add(R.id.frame, new Fragment2());
                break;
            case (2):
                fragmentTransaction.add(R.id.frame, new Fragment3());
                break;
        }
        fragmentTransaction.commit();


Далее, в зависимости от действий произведенных в фрагменте, заменяем на новый фрагмент и т.д.
public void getNextString() {
        int i = new Random().nextInt(3);
        while (resultsMassive[getNumString()][i+1] != null) {
            i = new Random().nextInt(3);
        }
        c = i;
    }

    public void replaceFragment() {
        if (variantsModelData.getTrainingList().size() > 0) {
            setResults();
            getNextString();
            variantsModelData.getTrainingList().remove(0);
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            switch (c) {
                case (0):
                    fragmentTransaction.replace(R.id.frame, new Fragment1());
                    break;
                case (1):
                    fragmentTransaction.replace(R.id.frame, new Fragment2());
                    break;
                case (2):
                    fragmentTransaction.replace(R.id.frame, new Fragment3());
                    break;
            }
            fragmentTransaction.commit();
        } else {
            resultsShow();
        }
    }

    private int getNumString() {
        for (int i = 0; i < resultsMassive.length; i++) {
            if (resultsMassive[i][0] == variantsModelData.getTrainingList().get(0).get(0)) {
                return i;
            }
        }
        return 0;
    }

    public void setResults() {
        resultsMassive[getNumString()][c + 1] = variantsModelData.isWin;
    }


По началу все идет окей, потом в какой-то момент, при нажатии кнопки во фрагменте(нажатие обрабатывается и и отдает данные в variantsModelData) и на этом приложение зависает с незаконченной анимацией нажатия кнопки и в дебагере следующее

E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
I/chatty: uid=10525(com.xxx.yyy) HeapTaskDaemon identical 3 lines
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
D/: [ZeroHung]zrhung_send_event: wp=257, ret=-1
E/ZrHungImpl:  sendAppFreezeEvent failed!
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
I/chatty: uid=10525(com.xxx.yyy) HeapTaskDaemon identical 3 lines
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
I/chatty: uid=10525(com.xxx.yyy) HeapTaskDaemon identical 2 lines
E/: [ZeroHung]zrhung_get_config: Get config failed for wp[0x0008]
D/: [ZeroHung]zrhung_send_event: wp=258, ret=-1
E/ZrHungImpl:  sendAppFreezeEvent failed!


и далее

Background concurrent copying GC freed 439209(8MB) AllocSpace objects, 0(0B) LOS objects, X% free, 7MB/14MB, paused 1.579ms total 119.148ms


где X с каждым разом все меньше

Я работаю с данными типа List>, фрагменты получают к ним доступ через ViewModel, во фрагментах просто присваиваю ссылку на объект созданный в активити. Фриз не зависит от фрагмента, может появиться в любом. В режиме, когда я добавляю один фрагмент, и работаю с ним все окей, а вот если их менять постоянно, то получаю вот такое..

Зависание происходит именно где-то во фрагменте, так как я ставила брикпоинт на вхождение в replaceFragment() в активити, и зависание и происходит до того, как фрагмент вызовет этот метод.

К сожалению, выкладывать коды фрагментов, не имеет смысла, так как слишком громоздко и никто все равно не разберет, что я там понаписала,.

Вопрос: Подскажите просто пожалуйста в чем суть ошибок в дебагере? На сколько понимаю, это не утечка памяти, ибо сборщик мусора вызывается и ошибки OOM нет.

UPD: Разобралась, недосмотрела и while в getNextString() зациклился бесконечно.
  • Вопрос задан
  • 894 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Dmtm
Android
добавить в проект leakcanary и с утечками памяти все станет яснее
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы