Android常见问题总结(三)

上一篇博客传送门:Android常见问题总结(二)

11. Android的数据存储形式

在Android中的数据存储形式主要有以下几种:

SharedPreferrences

SharedPreferrences主要用于存储一些少量的简单的应用程序配置信息。SharedPreferrences以明文键值对的形式把数据存储在一个xml文件上,该文件位于/data/data/<package name>/shared_prefs目录下。因此,SharedPreferrences只适合用于存储一些简单的数据,不适合存储复杂的或敏感的数据。

File

Android和Java一样,同样支持使用文件流来保存和访问文件。除了在手机内置存储空间上存储文件外,Android还支持读写SD卡上的文件:只要获取相应的权限后,调用Environment的getExternalStorageDirectory方法即可获取路径。

SQLite数据库

Android系统集成了一个轻量级的数据库:SQLite。SQLite是一个嵌入式数据库引擎,专门适用于资源有限的设备上适量数据的存取。在Android上我们一般使用SQLiteOpenHelper辅助类来操作SQLite数据库。

12. Sqlite的基本操作

SQLite为熟悉SQL语句的程序员提供了相应的函数使用SQL语句,也为不了解SQL语法的程序员提供了简便的增删查改接口:

String path = "数据库路径";
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(path, null);
// 执行sql语句
database.execSQL(sql);
// 执行带占位符的sql语句
database.execSQL(sql, bindArgs);
// 执行查找的sql语句
database.rawQuery(sql, selectionArgs);

// 执行增删查改
database.insert(table, nullColumnHack, values);
database.delete(table, whereClause, whereArgs);
database.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
database.update(table, values, whereClause, whereArgs);

// 开启事务
database.beginTransaction();
// 确认事务成功
database.setTransactionSuccessful();
// 结束事务
database.endTransaction();

13. Android中的MVC模式

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MVC模式的示意图如下:

(图片源自百度百科)

Android的设计也使用了MVC模式,其中:

  1. View对应于Android的View控件和xml所编写的界面
  2. Control对应于Android中的Activity,负责接收用户请求和改变模型状态
  3. Model一般由我们自己实现来处理程序功能和逻辑

14. Merge、ViewStub的作用

Merge和ViewStub均为Android中的xml优化标签,用于对Android的View布局进行优化。

Merge

merge标签应用于xml的顶层标签,主要应对于layout嵌套浪费的现象。在Android layout文件中需要一个顶级容器来容纳其他的组件,而不能直接放置多个组件,通过使用merge标签作为顶层容器,我们可以删减多余或者额外的层级,从而优化整个Android Layout的结构。

以下是一个例子:

activity_merge_test.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="top|center_horizontal"
        android:text="text_view"/>

    <TextView
        android:id="@+id/text_view_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom|center_horizontal"
        android:text="text_view_2"/>

</FrameLayout>

MergeTestActivity:

public class MergeTestActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_merge_test);
	}
}

效果图如下:

由hierarchyviewer分析可得(此处只分析与Activity界面相关的部分):

由hierarchyviewer得到的View树状图我们可以发现,id为content的FrameLayout中只有LinearLayout一个元素,造成了layout的嵌套浪费(如红框圈出所示)。此处我们若使用merge标签,便可以减少一层layout标签的嵌套,使程序运行得更快更流畅。

xml代码改为如下:

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="top|center_horizontal"
        android:text="text_view"/>

    <TextView
        android:id="@+id/text_view_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom|center_horizontal"
        android:text="text_view_2"/>

</merge>

效果图没有变化,使用hierarchyviewer分析可得:

此时已经减少了一层layout嵌套,我们通过使用merge标签,达到了优化的目的。

ViewStub

ViewStub即占位符,用于处理动态觉得显示某个View的情况。在开发应用程序的时候,我们经常会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性。也就是说,会耗费内存等资源。而使用ViewStub的话在inflate布局的时候不会被inflate,ViewStub的inflate操作被延迟到了直到我们调用其inflate方法。

ViewStub的xml文件设置如下:

    <ViewStub
        android:id="@+id/view_stub"
        android:inflatedId="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout="@layout/view_view_stub" />

其中,inflateId属性表示ViewStub被inflate后重新被赋予的id值,layout属性指定了调用inflate方法时inflate的具体布局。

找到ViewStub并调用inflate:

ViewStub viewStub = (ViewStub)findViewById(R.id.view_stub);
viewStub.inflate();

值得注意的是:

  1. ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
  2. ViewStub只能用来Inflate一个布局文件,而不是某个具体的View。

15. Json有什么优劣势

JSON,即JavaScript Object Notation,是 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

Json优点:

与传统的xml相比,Json有一下优点:

  1. 在解码难度方面,XML的解析得考虑子节点父节点,而Json不需要,解析难度较低
  2. Json数据的体积小
  3. Json的传输速度快于XML

但Json也有它不足之处:

  1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性
  2. 命名空间允许不同上下文中的相同的信息段彼此混合,然而在Json中已经找不到了命名空间
时间: 2024-10-14 09:05:04

Android常见问题总结(三)的相关文章

Android常见问题总结(四)

上一篇博客传送门:Android常见问题总结(三) 16. 动画有哪几类,各有什么特点 如今Android的动画主要有三种,分别是:逐帧(Frame)动画,补间(Tween)动画,属性(Property)动画 逐帧(Frame)动画 逐帧动画是最容易理解的动画,它要求我们把动画过程的每张静态图片都准备好,然后依次显示,利用人眼"视觉暂留"的原理形成动画效果. 例子:肥波跳舞? 素材准备(共27帧): fat_po.xml: <?xml version="1.0"

Android学习Scroller(三)——控件平移划过屏幕 (Scroller简单使用)

MainActivity如下: package cc.cn; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; /** * Demo描述: * Scroller使用示例--让控件平移划过屏幕 * * 参考资料: * http://blog.cs

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

Android 性能优化 三 布局优化ViewStub标签的使用

小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说可以用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件.(更多详细的API等信息可以查看官方文档ViewStub),计算机行业一向是实践里面出真知,下面用一个例子演示下效果. 小黑:说说概念只是为了概括性的了解下,还是用个实例来演示下.先来创建一个Activity中使用的布局文件,文件名是:act

Android学习Scroller(三)

MainActivity如下: package cc.testscroller2; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 实现可以拉动后回弹的布局. * 类似于下拉刷新的. * * 参考资料: * 1 http://gundumw100.iteye.com/blog/1884373 * 2 http://blog.csdn.net/gemmem/article/details/7321910

android 实践项目三

android 实践项目三 本周我主要完成的任务是将代码进行整合,然后实现百度地图的定位与搜索功能.在这次实现的 图形界面如下: 在本周的工作中主要的实现出来定位与收索的功能,在地图中能实现了定位,显示当前的位置, 不知到为什么不显示地图,经过查找资料可能因为当前的SDK本版太高了,不匹配.所以在下周 图像的显示问题.下面是我的主要贴上我的布局代码 地图的布局: 本周的总结 做项目是学习知识最快的方式,即能让我们碰见各种问题,也让我们去解决各种问题.在项目中感觉自己 的水平有限,还需要更加努力的

Android反编译(三)之重签名

Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序: b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证: c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期.如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能. d.A

android自定义控件(三)ProgressBar

1.ProgressBar有两个进度,一个是android:progress,另一个是android:secondaryProgress.比如视频的缓存进度以及播放进度. 在这里缓存的进度就可以是android:secondaryProgress,而播放进度就是android:progress. 2.ProgressBar分为确定的和不确定的 二.style 1.Widget.ProgressBar.Horizontal <style name="Widget.ProgressBar.Ho

Android 常见问题收集 (持续更新)

gridview中设置item的高度. 一.BaseAdapter中的getView中设置 AbsListView.LayoutParams param = new AbsListView.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, parent.getWidth()/2+DpPx.dip2px(context,20));//-20 10spacing 5padding + 40 textview.height