Android Studio - 如何从片段中停止 handler.postDelayed?

Android Studio - How to stop handler.postDelayed from a fragment?

描述:

查了一会儿,找到下一行代码:

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.access0(fragment_languages.java:21)
    at com.example.ui.INICIO.CATEGORIAS.LANGUAGES.fragment_languages.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 个处理程序的这个片段,并在他进入后按返回按钮,这也会使我的应用程序崩溃。这就是为什么我想停止处理程序(当按下后退按钮时)。

如何修复此错误?

你需要知道的:

我的处理程序片段在 activity 中(当然)。后退按钮在 activity 中(不在片段中)。

“片段语言”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);

Activity(带后退按钮)代码:

@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);
    }
}

编辑(父classjava代码):

public class father{

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

public Handler handler = new Handler();

public Window window;

}

如果片段的 view 被破坏(片段被破坏或在后台堆栈中),您可以跳过方法调用。有getView()方法

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

如果你使用FragmentTransaction的hide/show方法你可以使用FragmentisVisible()方法,因为隐藏片段view是View.GONE (不是 null