首页 > 解决方案 > 快速更改底部导航应用程序崩溃

问题描述

我有带有片段的底部导航和用于 api 调用的改造

我呼吁loadFragment如下切换片段

private boolean loadFragment(Fragment fragment) {
        //switching fragment
        if (fragment != null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fragment_container, fragment)
                    .commit();
            return true;
        }
        return false;
    }

问题是如果我开始随机单击并快速更改片段,我的应用程序崩溃,当我检查 logcat 时它在设置一些数据时显示 NPE。

我的片段由以下方法组成

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_current, container, false);
    unbinder = ButterKnife.bind(this, view);
    context = getActivity();
    callCategoryAPI();
    return view;
}

callCategory()interface是单独控制器类中的 api 改造调用,并通过然后设置数据带回响应。

所以我怀疑我的 API 返回响应(因为它是异步的)但是视图不可用,因为用户已经更改了片段(快速)所以视图为空。

我已经尝试setuserVisibleHint过 1200 毫秒的块点击,还检查了我的片段视图是否已创建,如何停止此崩溃?并使改造调用依赖于生命周期?

日志猫

在 com.example.CurrentFragment$1.onApiSuccess(CurrentFragment.java:82) 在 com.example.services.current_statement.CurrentStatementController$2.onResponse(CurrentStatementController.java:91) 在 retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java :70) 在 android.os.Handler.handleCallback(Handler.java:790) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:171) 在 android .app.ActivityThread.main(ActivityThread.java:6606) 在 java.lang.reflect.Method.invoke(Method.java) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

--

致命异常:java.lang.NullPointerException:尝试在 com.example.fragment.statements.CurrentFragment$1.onApiSuccess( CurrentFragment.java:82) 在 com.example.services.current_statement.CurrentStatementController$2.onResponse(CurrentStatementController.java:91) 在 retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70) 在 android.os.Handler。 handleCallback(Handler.java:790) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:171) 在 android.app.ActivityThread.main(ActivityThread.java :6606) 在 com.android 的 java.lang.reflect.Method.invoke(Method.java)。internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

标签: androidandroid-fragmentsretrofitbottomnavigationview

解决方案


在你的片段中设置

 if(activity != null && isAdded) {

  // perform your task

}

推荐阅读