android - 快速更改底部导航应用程序崩溃
问题描述
我有带有片段的底部导航和用于 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)
解决方案
在你的片段中设置
if(activity != null && isAdded) {
// perform your task
}
推荐阅读
- python-3.x - 部署 TensorFlow 对象检测模型和服务预测
- python - 使用 wxPython 打印多个页面
- callback - 如何从flutter中的状态类访问根类中的方法
- python - 打印格式,在 python 中访问 kwargs 时速记不起作用
- intellij-idea - IntelliJ macOS Mojave - 将 Java 类移动到另一个包中不考虑 JSON 文件
- google-cloud-platform - 我应该在运行时创建消息通道吗?
- android - 如何在 android retrofit 2 中上传照片?
- python - 如何阻止计数器增加
- sql - 如何删除重复记录(这是一个棘手的情况,行本质上不是唯一的,但它们的内容是)
- objective-c - 如何根据我的 API 的响应在 UITableViewCell 中使用 AVPlayer 和 Image