即使进程被终止,如何确保用户当前会话的全局 "cache"
How to ensure a global "cache" for the current session of the user even if process is killed
在我的情况下,我会尽量说得清楚和准确。
目前正在使用基于 MVVM 模式的 Koltin 开发 Android 应用程序,我遇到了一个质疑我的架构的问题。
我的应用程序包括检索用户的不同订单,每个订单本身都有一个产品列表。
我曾设想设置一个“CommandController”,它实际上是一个单例。
object CommandController : ICommandController {
override var m_commandRepository: ICommandRepository = CommandRepository()
override var m_commandList: MutableList<Command> = mutableListOf<Command>()
override var m_currentCommand: Command? = null
override var m_currentProduct : Produit? = null
override var m_currentProductIndex : Int = first_index
}
这个单例的目的是充当我的 viewModel 和我的存储库之间的中介,以便存储收到的命令和当前活动的命令(一次只有 1 个活动的命令)。
class CommandListViewModel : ViewModel() {
fun fetchCommandList(refreshStrategy: CommandRefreshStrategy){
viewModelScope.launch {
mProgressBar.postValue(true)
mErrorStatus.postValue(null)
try {
mCommandList.postValue(CommandController.getCommandsList(refreshStrategy)) //USE CONTROLLER HERE
mCommandActive.postValue(CommandController.getCurrentCommand()) //USE CONTROLLER HERE
}
catch (e: Exception) {
//this is generic exception handling
//so inform user that something went wrong
mErrorStatus.postValue(ApiResponseError.DEFAULT)
}
finally {
mProgressBar.postValue(false)
}
}
}
}
请注意,没有元素引用单例,kotlin 在 first needed
时对其进行初始化
如果我单击列表中的活动命令,我会显示其详细信息
我选择这样做是为了避免每次需要获取命令列表时都必须重新进行查询,无论片段/activity,即使目前我只在 1 个地方使用它.
所以我的图层如下:
一个我没有意识到的问题很烦人。
确实,如果我更改了应用程序授予的权限并返回到应用程序,最后启动的 activity 会在上次访问的片段中重新创建。
问题是我的单例回到了它的初始状态,所以我的活动命令是空的,因为进程在权限更改后被系统杀死了。
所以我想知道当我回到应用程序时是否有办法 persist/recover 我的单例状态。
我已经尝试将我的单例转移到从应用程序继承的 class,但这并没有解决被杀死进程的问题。
我已经阅读了很多 articles/subjects 关于共享偏好的文章,但我遇到了很多问题:
控制器应该是一个纯粹的业务元素,除了共享首选项需要上下文
如果用户自己杀死了应用程序,我不希望当前命令和命令列表保留下来(有没有办法区分进程的死亡是由系统还是由用户 ??).
Android 将出于各种原因终止 OS 个进程。如果你想让你的数据在这种情况下存活下来,那么你必须将它存储在一个持久存储中。以下之一:
- 将其存储在文件中
- 存储在
SharedPreferences
- 将其存储在 SQLite 数据库中
- 将其存储在某些服务器上的云中,您以后可以在其中检索它
在我的情况下,我会尽量说得清楚和准确。
目前正在使用基于 MVVM 模式的 Koltin 开发 Android 应用程序,我遇到了一个质疑我的架构的问题。
我的应用程序包括检索用户的不同订单,每个订单本身都有一个产品列表。
我曾设想设置一个“CommandController”,它实际上是一个单例。
object CommandController : ICommandController {
override var m_commandRepository: ICommandRepository = CommandRepository()
override var m_commandList: MutableList<Command> = mutableListOf<Command>()
override var m_currentCommand: Command? = null
override var m_currentProduct : Produit? = null
override var m_currentProductIndex : Int = first_index
}
这个单例的目的是充当我的 viewModel 和我的存储库之间的中介,以便存储收到的命令和当前活动的命令(一次只有 1 个活动的命令)。
class CommandListViewModel : ViewModel() {
fun fetchCommandList(refreshStrategy: CommandRefreshStrategy){
viewModelScope.launch {
mProgressBar.postValue(true)
mErrorStatus.postValue(null)
try {
mCommandList.postValue(CommandController.getCommandsList(refreshStrategy)) //USE CONTROLLER HERE
mCommandActive.postValue(CommandController.getCurrentCommand()) //USE CONTROLLER HERE
}
catch (e: Exception) {
//this is generic exception handling
//so inform user that something went wrong
mErrorStatus.postValue(ApiResponseError.DEFAULT)
}
finally {
mProgressBar.postValue(false)
}
}
}
}
请注意,没有元素引用单例,kotlin 在 first needed
时对其进行初始化如果我单击列表中的活动命令,我会显示其详细信息
我选择这样做是为了避免每次需要获取命令列表时都必须重新进行查询,无论片段/activity,即使目前我只在 1 个地方使用它.
所以我的图层如下:
一个我没有意识到的问题很烦人。
确实,如果我更改了应用程序授予的权限并返回到应用程序,最后启动的 activity 会在上次访问的片段中重新创建。
问题是我的单例回到了它的初始状态,所以我的活动命令是空的,因为进程在权限更改后被系统杀死了。
所以我想知道当我回到应用程序时是否有办法 persist/recover 我的单例状态。
我已经尝试将我的单例转移到从应用程序继承的 class,但这并没有解决被杀死进程的问题。
我已经阅读了很多 articles/subjects 关于共享偏好的文章,但我遇到了很多问题:
控制器应该是一个纯粹的业务元素,除了共享首选项需要上下文
如果用户自己杀死了应用程序,我不希望当前命令和命令列表保留下来(有没有办法区分进程的死亡是由系统还是由用户 ??).
Android 将出于各种原因终止 OS 个进程。如果你想让你的数据在这种情况下存活下来,那么你必须将它存储在一个持久存储中。以下之一:
- 将其存储在文件中
- 存储在
SharedPreferences
- 将其存储在 SQLite 数据库中
- 将其存储在某些服务器上的云中,您以后可以在其中检索它