Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何确保一个全球性的;“缓存”;对于用户的当前会话,即使进程已终止_Android_Mvvm_Singleton_Sharedpreferences_Android Lifecycle - Fatal编程技术网

Android 如何确保一个全球性的;“缓存”;对于用户的当前会话,即使进程已终止

Android 如何确保一个全球性的;“缓存”;对于用户的当前会话,即使进程已终止,android,mvvm,singleton,sharedpreferences,android-lifecycle,Android,Mvvm,Singleton,Sharedpreferences,Android Lifecycle,在我的情况下,我会尽可能的清晰和准确 目前,我正在使用基于MVVM模式的Koltin开发Android应用程序,我面临的一个问题是我的体系结构有问题 我的应用程序包括检索用户的不同订单,每个订单本身都有一个产品列表 我曾想象过建立一个“CommandController”,实际上是一个单体 object CommandController : ICommandController { override var m_commandRepository: ICommandRepository = C

在我的情况下,我会尽可能的清晰和准确

目前,我正在使用基于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
请注意,没有任何元素具有对singleton的引用,kotlin会在它被引用时初始化它

如果单击列表中的活动命令,将显示其详细信息

我选择这样做是为了避免每次需要获取命令列表时都必须重新生成查询,而不管片段/活动是什么,即使目前我只在1个位置使用它

因此,我的图层如下所示:

我没有意识到的一个问题很烦人

事实上,如果我更改了应用程序授予的权限并返回到应用程序中,那么最后启动的活动将在最后访问的片段中重新创建

问题是,我的singleton返回到其初始状态,因此我的活动命令为null,因为在更改权限后,进程被系统终止

因此,我想知道,当我回到应用程序中时,是否有一种方法可以保持/恢复我的单例状态

我已经尝试将我的单例转换为从应用程序继承的类,但这并不能解决被终止进程的问题

我读过很多关于共享偏好的文章/主题,但我有很多问题:

  • 除了共享首选项需要上下文之外,控制器应该是纯业务元素

  • 如果用户自己杀死应用程序,我不想保留当前命令和命令列表(有没有办法区分系统和用户导致的进程死亡??)


  • 由于各种原因,Android将关闭操作系统进程。如果您想让您的数据在这种情况下继续存在,那么必须将其存储在持久性存储中。以下其中一项:

    • 将其存储在文件中
    • 将其存储在
      SharedReferences
    • 将其存储在SQLite数据库中
    • 将其存储在云计算中的某个服务器上,以便以后检索

    您好,感谢您为确保我的数据的持久性提供的众多可能性!我将更详细地介绍这些。
     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)
                    }
        
                }
        }
    }