java - 停止片段的函数和调用并重置内部变量
问题描述
在我的应用程序中,我有一个活动和一个片段。
该片段与活动给出的参数“A”一起使用。它有自己的数组等。片段在不同的函数之间移动(从一个函数到另一个函数),它还调用异步函数来接收文件、从数据库读取等。
情况是,我希望在我按下 mi 活动中的按钮的具体时刻,从我的主要活动向片段发送通知以停止所有处理并从原始参数“B”开始该过程。即重启fragment中的所有变量,停止当前运行的所有函数,以及所有异步函数等,以b参数启动fragment中的整个过程。
我的解决方案,不起作用如下:
我在片段中有一个 GetRequest(request) 功能。
从活动中,我调用了这个函数,修复了一个参数请求 == B。
在片段的每个函数中,我在这些函数的开头都有一个条件,检查是否(请求!= null)。然后,如果 request != null 我在片段中调用一个函数来重新启动所有内部变量,并调用第一个函数等。否则,我继续正常的代码。
问题是我认为这不适用于异步函数,因为有时我在变量中收到错误,我重置为 null 并且他们正在尝试读取,等等。
我确信这不是实现这一目标的最佳方式。请你帮助我好吗?
谢谢!
解决方案
我会建议你在这种情况下使用LiveData
withViewModel
例如:
首先创建一个ViewModel
类
你的ViewModel.java:
//initialize this mutableLiveData first
public MutableLiveData<String> parameterA = new MutableLiveData<>("");
private void setParameterA(String myValue){
parameterA.setValue(myValue);
}
然后在YourActivity.java中,获取ViewModel
类
YourViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
... all other thing
viewModel = ViewModelProviders.of(this).get(YourViewModel.class);
}
//then whatever the situation in activity,u want to update parameterA
private void SomeSituation() {
//update the parameterA
...
viewModel.setParameterA("Your value Here")
}
然后在你的片段中,观察参数A的值
你的片段:
// in onCreate() or onViewCreated()
@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//get the same viewModel
viewModel = ViewModelProviders.of(requireActivity()).get(YourViewModel.class);
viewModel.parameterA.observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(String parameterA) {
// anything changes on parameterA
// do whatever you want with the value S
}
});
}
所以通过上面的方法,只要parameterA
在活动中发生变化,片段就会异步更新,然后你可以对onChanged()
节内的更新值做任何你想做的事情。
正如您在评论中提到的:
接收文件(从数据库读取)、变量、数组
LiveData
也可以用于自定义模型类,例如MutableLiveData<List<Post>>
,因此当您setValue()
进入时activity
,您的片段可以在中获取值 asynchornous onChanged()
。
在使用之前LiveData
,您需要将组件添加到您的项目中
推荐阅读
- stm32 - 出现错误的 FreeRTOS 项目设置:字符串常量之前应为“)”
- multithreading - kotlin 嵌套线程 - “在此范围内有多个标签具有这样的名称”
- sql - Oracle 与 MariaDB 的分析功能
- javascript - Jest Ref 事件未触发
- c# - 向最终用户提供 Asp.Net Core 健康信息的最佳方式是什么?
- linq - 从 LINQ 的列表中设置默认值
- python - 重组从客户端发送到服务器的字节的最佳方法是什么?
- javascript - Firebase auth onCreate 添加动态自定义声明
- email - DKIM 是否也对附件进行签名,还是仅对标题字段和正文进行签名?
- mysql - 跨文件共享变量,而无需在 Node.js 中创建它们的副本