代码之家  ›  专栏  ›  技术社区  ›  Dave

使用android应用程序类来持久化数据

  •  106
  • Dave  · 技术社区  · 14 年前

    我正在开发一个相当复杂的Android应用程序,它需要应用程序的大量数据(我想说,总共大约500kb——对于移动设备来说,这样大吗?).据我所知,应用程序中的任何方向更改(更准确地说,在活动中)都会导致活动的完全破坏和重现。根据我的发现,应用程序类没有相同的生命周期(即,对于所有意图和目的,它总是实例化的)。将状态信息存储在应用程序类内,然后从活动中引用它是否有意义,或者由于移动设备的内存限制,这通常不是“可接受”的方法?我真的很感激关于这个话题的任何建议。谢谢!

    6 回复  |  直到 14 年前
        1
  •  131
  •   Shubham AgaRwal    9 年前

    我不认为500kb会有什么大不了的。

    您所描述的正是我如何处理在活动中丢失数据的问题。我在应用程序类中创建了一个全局单例,并能够从我使用的活动中访问它。

    如果要大量使用,可以在全局单例中传递数据。

    public class YourApplication extends Application 
    {     
         public SomeDataClass data = new SomeDataClass();
    }
    

    然后在任何活动中通过以下方式调用它:

    YourApplication appState = ((YourApplication)this.getApplication());
    appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.
    

    我讨论一下 here in my blog post ,在“Global Singleton”部分下。

        2
  •  56
  •   Murmel    7 年前

    依靠的人 Application 实例错误。起初,似乎 应用 只要整个应用程序过程存在就存在,但这是一个错误的假设。

    操作系统可能会在必要时终止进程。所有过程分为5级“杀戮性” specified in the doc

    因此,例如,如果您的应用程序由于用户接听来电而进入后台,那么根据RAM的状态,操作系统可能(或不可能)终止您的进程(破坏 应用 进程中的实例)。

    我认为更好的办法是 persist your data to internal storage file 然后在活动恢复时阅读。

    更新:

    我收到了很多负面反馈,所以是时候再澄清一下了。:)好吧,最初我确实使用了一个错误的假设,即状态对应用程序非常重要。但是,如果您的应用程序正常,有时状态会丢失(可能是一些只需重新读取/重新下载的图像),那么将其作为 应用

        3
  •  6
  •   saxos    14 年前

    如果您想访问活动外部的“全局单例”而不想通过 Context 通过所有涉及到的对象来获取singleton,您可以在应用程序类中定义一个静态属性,该属性保存对自身的引用。只需初始化中的属性 onCreate() 方法。

    例如:

    public class ApplicationController extends Application {
        private static ApplicationController _appCtrl;
    
        public static ApplicationController getAppCtrl()
        {
             return _appCtrl;
        }
    }
    

    因为的子类 Application 还可以获取资源,您可以在定义静态方法时简单地访问这些资源,该方法返回这些资源,例如:

    public static Resources getAppResources()
    {
        return _appCtrl.getResources();
    }
    

    但是在传递上下文引用到 avoid memory leaks

        4
  •  2
  •   Andrew    14 年前

    戴夫,这是什么数据?如果是与整个应用程序相关的常规数据(例如:用户数据),那么扩展应用程序类并将其存储在那里。如果数据与活动相关,则应使用OnSaveInstanceState和OnRestoreStanceState处理程序在屏幕旋转时保留数据。

        5
  •  1
  •   Community Paul Sweatte    7 年前

    您实际上可以覆盖方向功能,以确保您的活动不会被破坏和重新创建。看 here

        6
  •  0
  •   Ashish Jaiswal    9 年前

    您可以创建应用程序类并将所有数据保存在该CASS上,以便在应用程序的任何位置使用。

    推荐文章