描述:
调查了一会儿,我来寻找下一行代码:
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)
[我正在调用三个处理程序,这些处理程序将项目加载到三个不同的回收器视图中并在不同的时间加载(这是因为,如果我不等待加载它们,那么应用程序会因为使用太多内存而崩溃,导致崩溃)。
问题:
“ troll”用户可以进入我的应用程序,然后进入这个片段,我有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;
}
非常感谢您阅读,我希望我能解决这个问题。
如果片段的view
被销毁(片段被销毁或位于后堆栈中,则只需跳过方法调用)。有getView()方法
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(getView() != null){
fillRecycler2();
}
}
},1500);
如果使用FragmentTransaction
的隐藏/显示方法,则可以使用isVisible()的Fragment
方法,因为隐藏的片段view
是View.GONE(不是null
)