Android Studio - 如何从片段中停止 handler.postDelayed?
Posted
技术标签:
【中文标题】Android Studio - 如何从片段中停止 handler.postDelayed?【英文标题】:Android Studio - How to stop handler.postDelayed from a fragment? 【发布时间】:2020-06-15 06:19:29 【问题描述】:说明:
查了一会,来找下一行代码:
handler.removeCallbacksAndMessages(null);
我已经尝试过了,但它无法解决我的问题。这是我得到的错误:
java.lang.IllegalStateException: Fragment fragment_languagesf33796 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 个处理程序并在他进入后按返回按钮,这也会使我的应用程序崩溃。这就是为什么我想停止处理程序(按下后退按钮时)。
如何修复此错误?
你需要知道的:
我的带有处理程序的片段在一个活动中(当然)。后退按钮在活动中(不在片段中)。
“片段语言”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;
【问题讨论】:
你能显示复制错误的代码吗? 您好,感谢您的提问。我已经更新了我的问题:)p.handler.removeMessages(0);
@IntelliJAmiya 感谢您的回答。那没用:(。我用错误更新了我的问题
【参考方案1】:
如果片段的view
被破坏(片段被破坏或在后台堆栈中),您可以跳过方法调用。有getView()方法
handler.postDelayed(new Runnable()
@Override
public void run()
if(getView() != null)
fillRecycler2();
,1500);
如果你使用FragmentTransaction
的隐藏/显示方法,你可以使用Fragment
的isVisible()方法,因为隐藏片段view
是View.GONE(不是null
)
【讨论】:
哇!非常感谢。我学到了一些新东西,你解决了我的问题,非常感谢!以上是关于Android Studio - 如何从片段中停止 handler.postDelayed?的主要内容,如果未能解决你的问题,请参考以下文章
当用户切换到 Android Studio Kotlin 中的其他页面时,如何停止播放音乐?
如何从 Android Studio 中片段的 XML 布局导航到相应的 java 类?
如何防止Android studio格式化build.gradle
从 Android Studio 中的片段将数据写入 Firebase