Android Studio - Как остановить handler.postDelayed из фрагмента? - PullRequest
1 голос
/ 03 марта 2020

Описание:

На какое-то время я пришел к поиску кода следующей строки:

handler.removeCallbacksAndMessages(null);

Я пробовал, но решить не смог моя проблема. Это ошибка, которую я получаю:

java.lang.IllegalStateException: Fragment fragment_languages{f33796} not attached to a context.
at androidx.fragment.app.Fragment.requireContext(Fragment.java:696)
    at androidx.fragment.app.Fragment.getResources(Fragment.java:760)
    at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages.fillRecycler4(fragment_languages.java:173)
    at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages.access$200(fragment_languages.java:21)
    at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages$3.run(fragment_languages.java:61)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6694)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

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

Проблема:

Пользователь "тролля" может просто войти в мое приложение, а затем получить этот фрагмент, у которого есть мой 4 обработчика и нажмите кнопку «Назад», как только он войдет, и это вызовет sh мое приложение тоже. Вот почему я хочу остановить обработчики (при нажатии кнопки назад).

Что я могу сделать, чтобы исправить эту ошибку? : (

Что нужно знать:

Мой фрагмент с обработчиками находится внутри действия (конечно). Кнопка возврата находится в действии ( не во фрагменте).

"Языки фрагментов" JAVA код:

father p = new father();

fillRecycler1();

    p.handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            fillRecycler2();
        }
    },1500);

    p.handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            fillRecycler3();
        }
    },2500);

    p.handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            fillRecycler4();
        }
    },3500);

Активность (с кнопкой возврата) Код:

@Override
public void onBackPressed(){
    if(p.contador == 0){
        Intent intent = new Intent(categorias.this, MainActivity.class);
        finish();
        startActivity(intent);

        p.handler.removeCallbacksAndMessages(null);

        p.contador++;

        p.handler.postDelayed(new Runnable(){
            @Override
            public void run(){
                p.contador = 0;
            }
        },500);
    }
}

Редактировать (класс отца java код):

public class father{

public int contador = 0;
public String aux = null;

public Handler handler = new Handler();

public Window window;

}

Большое спасибо за чтение и я sh Я мог бы решить эту проблему.

1 Ответ

1 голос
/ 18 марта 2020

Вы можете просто пропустить вызов метода, если фрагмент view уничтожен (фрагмент уничтожен или находится в backstack). Существует getView () метод

handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if(getView() != null){
            fillRecycler2();
        }
    }
},1500);

Если вы используете методы скрытия / показа FragmentTransaction, вы можете использовать isVisible () метод Fragment, потому что скрытые фрагменты view это View.GONE (не null)

...