关于客户端设计之数据分类和存储 的思考

一、关于数据的分类

Android 客户端设计过程中,我将数据分为未知,已知(本地),临时,三者之间根据需求相互转化。

  • 未知主要来自用户输入和服务端输入。
  • 已知主要来自sharedPerferences,SQLite等本地存储。
  • 临时主要是指存在于当前内存中的数据。在程序运行后,来自于前两种方式,随载体的生命周期开始,结束。(这里尤其注意单例模式下的数据的特殊,使用static或者Application,各有利弊。)

二、Android下数据单例模式设计

1、Application本身就是单例模式下的类,通过在Application下持有目标的类的引用实现单例的功能,但是当功能的实现在功能类外面,我们考虑的是封装的实现十分困难。

2、通过Java中static关键词实现。

这里存在两个弊端:

一是Android关于进程的界限模糊,举个例子说,在Activity中静态变量无法再Service中使用。

二是static变量的生命周期过长,环境不会维护它的生命周期,即没有被销毁也没有置null,其对象一直被保持引用。因此我们需要自己维护单例类的生命周期(这与java的思想冲突)。

三、已知数据(本地缓存)的设计

1、无疑第一反应使用封装的sharedPreference,以key-value组织形式,同时本身底层也是通过xml文件实现。

缺陷是对事物的表述能力差,很难对复杂的逻辑描述。比如一个父亲和几个孩子的关系。这里需要依靠SQLilte进行描述。

public class ParentCache {

    private static ParentCache parentCache;
    private SharedPreferences parentPreferences;
    private Parent parent;

    private String phone;
    private String pwd;
    private Set<String> childNameSet;
    private String currentChild;

    private static final String KEY_PHONE = "phone";
    private static final String KEY_PWD = "pwd";
    private static final String KEY_CHILD_NAME_LIST = "childNameList";
    private static final String KEY_CURRENT_CHILD = "currentChild";

    private ParentCache(Context context){
        parentPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static ParentCache getInstance(Context context) {

        if(parentCache == null) {
            parentCache = new ParentCache(context.getApplicationContext());
        }
        return parentCache;
    }

    /**
     * 考虑能够通过对返回值处理进行健壮性完善和parent处理,使用commit() not apply()。
     * <p>使用apply()需要synchronized处理同步<p/>
     */
    public synchronized boolean clearCache() {

        boolean result = parentPreferences.edit().clear().commit();//commit()也存在对同步的处理。性能存在缺陷。

        if (result) {
            this.parent = null;
        }
        return result;
    }

    public synchronized String getPhone() {

        if (TextUtils.isEmpty(pwd)) {
            pwd = parentPreferences.getString(KEY_PHONE, null);
        }
        return pwd;
    }

    public synchronized String getPwd() {

        if (TextUtils.isEmpty(phone)) {
            phone = parentPreferences.getString(KEY_PHONE, null);
        }
        return phone;
    }

    public synchronized boolean setPhone(String phone) {

        SharedPreferences.Editor editor = parentPreferences.edit();

        boolean ret = editor.putString(KEY_PHONE, phone).commit();

        if (ret) {
            this.phone = phone;
        }
        return ret;
    }

    public synchronized boolean setPwd(String pwd) {

        SharedPreferences.Editor editor = parentPreferences.edit();

        boolean ret = editor.putString(KEY_PWD, pwd).commit();

        if (ret) {
            this.pwd = pwd;
        }
        return ret;
    }

    public synchronized Set<String> getChildNameSet() {
        if(childNameSet==null){
            childNameSet = parentPreferences.getStringSet(KEY_CHILD_NAME_LIST,null);
        }
        return childNameSet;
    }

    public synchronized boolean setChildNameSet(Set<String> childNameSet) {

        SharedPreferences.Editor editor = parentPreferences.edit();

        boolean ret = editor.putStringSet(KEY_CHILD_NAME_LIST,childNameSet).commit();

        if (ret){
            this.childNameSet = childNameSet;
        }
        return ret;
    }

    public synchronized String getCurrentChild() {
        if (TextUtils.isEmpty(currentChild)) {
            currentChild = parentPreferences.getString(KEY_CURRENT_CHILD,null);
        }
        return currentChild;
    }

    public boolean setCurrentChild(String currentChild) {
        SharedPreferences.Editor editor = parentPreferences.edit();

        boolean ret = editor.putString(KEY_CURRENT_CHILD, currentChild).commit();

        if (ret) {
            this.currentChild = currentChild;
        }
        return ret;
    }
}

2、对复杂的逻辑数据存储。

时间: 2024-08-01 11:01:09

关于客户端设计之数据分类和存储 的思考的相关文章

GPS部标平台的架构设计(九)-GPS监控客户端设计

交通部的部标过检,所有的测试都是从客户端发起的,也是在客户端体现的,在客户端承载了部标标准所要求的所有的功能,是整个部标平台当中工作量最大的部分,也是最繁琐的部分. 客户端设计面临两个问题: 1.基于CS还是基于BS,这是个问题 萝卜白菜各有所爱,客户要什么,我们就开发什么,从客户来讲,更适应桌面客户端,没有浏览器的七七八八问题,速度感觉上也比网页的快,操作方便.当然网页客户端也有很大的优势,部署和维护方便,不需要开发升级系统. 2.与服务端的交互通信,采用Socket, WebService还

基于Html5的智能家居手机客户端设计(一)——找到openhab的rest

今天开始我的毕业设计,基于HTML5的智能家居手机客户端设计.挑剔了好久,终于找到我可以使用国外开源项目智能家居核心,通过restful(我也不是很懂,毕竟我只是电子信息学院爱好网络). REST描述了一个架构样式的网络系统,比如 web 应用程序.在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量

Android 客户端设计之环境考虑

我做过两三个android客户端应用的整体设计和部分的编码,这里仅仅谈一下设计方面的故事(此乃原创2015:11:02). 做客户端设计,首先要考虑应用所在的环境,包括三方面:1 要设计的apk是在一个低内存,低运行速率,多应用共同运行(现在很多应用都在后台一直存活,不死鸟)的环境中:2 要设计的apk需要调用系统其它的数据或功能接口:3 apk置身于整体手机的运行环境中,必然手机的各种状态的变化,会对apk的运行造成影响,例如开网断网,亮屏灭屏等. 从1来考虑,必须要在设计之初,从数据流考虑a

安卓升级服务端和客户端设计

三.服务器端和客户端设计 服务器端设计: 设计方法应该有很多,下面介绍我的一种方法: a.首先在服务器项目下建立一个文件夹来存放APK安装文件: b.其次在src下建立一个资源文件,apkVersion.properties,属性定义如下: [plain] view plaincopyprint? apkVersion=1 存版本号apkSize=550kb 大小apkPath=http://xx8080/srv/apk/Demo.apk 升级文件 c.定义一个servlet来获取资源中的信息:

如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算

package interview_10_10; import org.junit.Test; public class T1 { /** * 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算). */ @Test public void test1() { String number1 = "4324328732789"; String number2 = "2383244324324325898

高德客户端及引擎技术架构演进与思考

2019杭州云栖大会上,高德地图技术团队向与会者分享了包括视觉与机器智能.路线规划.场景化/精细化定位.时空数据应用.亿级流量架构演进等多个出行技术领域的热门话题.现场火爆,听众反响强烈.我们把其中的优秀演讲内容整理成文并陆续发布出来,本文为其中一篇. 阿里巴巴高级无线开发专家宋照春在高德技术专场做了题为<高德客户端及引擎技术架构演进与思考>的演讲,主要分享了高德地图客户端技术架构沿着「上漂下沉」.「模块化.Bundle化」的思路演进所做的一系列架构升级中的经验和思考. 以下为宋照春演讲内容的

Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)

1. 多个客户端上传到一个服务器的思考 通过while循环可以改进一个服务器接收多个客户端. 但是这个是有问题的.如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端  张三:好好学习.avi(100M) 256k  李四:天天向上.mp3(3M)   1M  王五:ILoveJava.txt(1k) 100M 这要等张三传完了,再去传李四…… 2. 使用多线程改进: (1)线程类UserThread: 1 package cn.itcast_15; 2 3 import java.

《攻城Online》快速原型:客户端设计

“攻城”客户端采用Unity引擎并结合Photon框架进行开发. 关于将Photon配置进游戏引擎中的操作本篇直接省略. 在展开之前,先来看看Unity的文件夹组织层次. Audios放音频文件,Libs放一些外部的动态链接库文件,Models放模型资源,预留的Resources文件夹主要服务于Resource类,Scenes放场景文件,重点是Scripts文件夹. 首先ClientLogic层存放与逻辑相关的脚本.Photon客户端采用事件监听体制,Event中存放事件数据类的定义,从下面的项

TYPESDK手游聚合SDK客户端设计思路与架构之四:unity开发平台部分结构设计和思路

在上一篇<iOS平台接口设计及思路>中我们阐述了ios平台的接口结构和思路.在这里我们将阐述unity平台下的接口结构和思路. unity平台是开发平台,我们的程序代码是在这个ide下堆叠的.unity端并不需要过多的考虑不同运行平台(安卓/iOS)上的底层机制是如何实现的,本身unity已经做了相应的处理,我们只需要知道自己当前的运行平台是什么样的,然后做好相关的平台差异 2.对不同运行平台(安卓/iOS)能自适配 化接口调用就行. 因为unity平台是开发平台,游戏渠道的差异性我们在运行平