android 保存 用户名和密码 设置等应用信息优化
1、传统的保存用户名,密码方式 SharedPreferences
- Editor editor = shareReference.edit();
- editor.putString(KEY_NAME,"username_value");
通过这样的方法,能够基本满足需求,比如有用户名,那么就Editor.putString存放就好。
但是这样的方法有一些弊端:
(1)在存放一些集合信息,存储ArrayList就不合适
(2)如果针对用户,新增加了很多熟悉,比如性别,头像等信息,那么需要一个一个的添加put和get方法,非常的繁琐。
2、通过序列化对象,将对象序列化成base64编码的文本,然后再通过SharedPreferences 保存,那么就方便很多,只需要在对象里增加get和set方法就好。
3、 序列换通用方法, 将list对象或者普通的对象序列化成字符串
- package com.example.imagedemo;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.StreamCorruptedException;
- import java.util.List;
- import android.util.Base64;
- public class SerializableUtil {
- public static <E> String list2String(List<E> list) throws IOException{
- //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- //然后将得到的字符数据装载到ObjectOutputStream
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- //writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
- oos.writeObject(list);
- //最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
- String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
- //关闭oos
- oos.close();
- return listString;
- }
- public static String obj2Str(Object obj)throws IOException
- {
- if(obj == null) {
- return "";
- }
- //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- //然后将得到的字符数据装载到ObjectOutputStream
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- //writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
- oos.writeObject(obj);
- //最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
- String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
- //关闭oos
- oos.close();
- return listString;
- }
- //将序列化的数据还原成Object
- public static Object str2Obj(String str) throws StreamCorruptedException,IOException{
- byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
- ByteArrayInputStream bais = new ByteArrayInputStream(mByte);
- ObjectInputStream ois = new ObjectInputStream(bais);
- try {
- return ois.readObject();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public static <E> List<E> string2List(String str) throws StreamCorruptedException,IOException{
- byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
- ByteArrayInputStream bais = new ByteArrayInputStream(mByte);
- ObjectInputStream ois = new ObjectInputStream(bais);
- List<E> stringList = null;
- try {
- stringList = (List<E>) ois.readObject();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return stringList;
- }
- }
4、 要保存的用户对象
- package com.example.imagedemo;
- import java.io.Serializable;
- import android.annotation.SuppressLint;
- public class UserEntity implements Serializable
- {
- private static final long serialVersionUID = -5683263669918171030L;
- private String userName;
- // 原始密码
- public String getUserName()
- {
- return userName;
- }
- public void setUserName(String userName)
- {
- this.userName = userName;
- }
- public String getPassword()
- {
- return password;
- }
- public void setPassword(String password)
- {
- this.password = password;
- }
- private String password;
- }
5、编写SharedPreUtil ,实现对对象的读取和保存
- package com.example.imagedemo;
- import java.io.IOException;
- import java.io.StreamCorruptedException;
- import android.content.Context;
- import android.content.Intent;
- import android.content.SharedPreferences;
- import android.content.SharedPreferences.Editor;
- public class SharedPreUtil
- {
- // 用户名key
- public final static String KEY_NAME = "KEY_NAME";
- public final static String KEY_LEVEL = "KEY_LEVEL";
- private static SharedPreUtil s_SharedPreUtil;
- private static UserEntity s_User = null;
- private SharedPreferences msp;
- // 初始化,一般在应用启动之后就要初始化
- public static synchronized void initSharedPreference(Context context)
- {
- if (s_SharedPreUtil == null)
- {
- s_SharedPreUtil = new SharedPreUtil(context);
- }
- }
- /**
- * 获取唯一的instance
- *
- * @return
- */
- public static synchronized SharedPreUtil getInstance()
- {
- return s_SharedPreUtil;
- }
- public SharedPreUtil(Context context)
- {
- msp = context.getSharedPreferences("SharedPreUtil",
- Context.MODE_PRIVATE | Context.MODE_APPEND);
- }
- public SharedPreferences getSharedPref()
- {
- return msp;
- }
- public synchronized void putUser(UserEntity user)
- {
- Editor editor = msp.edit();
- String str="";
- try {
- str = SerializableUtil.obj2Str(user);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- editor.putString(KEY_NAME,str);
- editor.commit();
- s_User = user;
- }
- public synchronized UserEntity getUser()
- {
- if (s_User == null)
- {
- s_User = new UserEntity();
- //获取序列化的数据
- String str = msp.getString(SharedPreUtil.KEY_NAME, "");
- try {
- Object obj = SerializableUtil.str2Obj(str);
- if(obj != null){
- s_User = (UserEntity)obj;
- }
- } catch (StreamCorruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- return s_User;
- }
- public synchronized void DeleteUser()
- {
- Editor editor = msp.edit();
- editor.putString(KEY_NAME,"");
- editor.commit();
- s_User = null;
- }
- }
6、 调用Activity代码
- package com.example.imagedemo;
- import android.app.Activity;
- import android.os.Bundle;
- import android.text.TextUtils;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class ActivityMain extends Activity
- {
- EditText edit_pwd;
- EditText edit_name;
- Button button;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- SharedPreUtil.initSharedPreference(getApplicationContext());
- edit_pwd = (EditText)findViewById(R.id.pwd);
- edit_name = (EditText)findViewById(R.id.name);
- button = (Button)findViewById(R.id.btn);
- //保存到本地
- button.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- String name = edit_name.getText().toString();
- String pwd = edit_pwd.getText().toString();
- UserEntity user = new UserEntity();
- user.setPassword(pwd);
- user.setUserName(name);
- //用户名,密码保存在SharedPreferences
- SharedPreUtil.getInstance().putUser(user);
- }
- });
- Button delBtn = (Button)findViewById(R.id.btn_del);
- delBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- SharedPreUtil.getInstance().DeleteUser();
- edit_name.setText("");
- edit_pwd.setText("");
- }
- });
- UserEntity user = SharedPreUtil.getInstance().getUser();
- if(!TextUtils.isEmpty(user.getPassword()) && !TextUtils.isEmpty( user.getUserName() ) ){
- edit_name.setText(user.getUserName());
- edit_pwd.setText(user.getPassword());
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu)
- {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- }
对应的布局文件
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingBottom="@dimen/activity_vertical_margin"
- android:paddingLeft="@dimen/activity_horizontal_margin"
- android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin"
- android:orientation="vertical"
- tools:context=".ActivityMain" >
- <EditText
- android:id="@+id/name"
- android:hint="please input name"
- android:layout_width="fill_parent"
- android:layout_height="40dip" />
- <EditText
- android:id="@+id/pwd"
- android:layout_width="fill_parent"
- android:hint="please input password"
- android:layout_height="40dip" />
- <Button
- android:id="@+id/btn"
- android:layout_width="wrap_content"
- android:layout_height="40dip"
- android:text="保存" >
- </Button>
- <Button
- android:id="@+id/btn_del"
- android:layout_width="wrap_content"
- android:layout_height="40dip"
- android:text="清除" >
- </Button>
- </LinearLayout>
来个截图
7、 如果我们的应用程序有不太复杂的保存需求,那么就可借助 SerializableUtil list2String 将list对象保存为文本,然后在通过文本的方式来读取,这样就不用使用数据库了,会轻量很多。
android 保存 用户名和密码 设置等应用信息优化的更多相关文章
- Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》
之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...
- 终于解决“Git Windows客户端保存用户名与密码”的问题(转载)
add by zhj:不建议用这种方法,建议用SSH,参见 TortoiseGit密钥的配置 http://www.cnblogs.com/ajianbeyourself/p/3817364.html ...
- iOS 使用Keychain 保存 用户名和密码到 本地
iOS 使用Keychain 保存 用户名和密码到 本地 之前曾把一些简单的数据保存在了plist,文件,及NsuserDefault里面, 但是如果要保存密码之类的,保存在本地就很不安全了: 但是利 ...
- git保存用户名和密码
git保存用户名和密码 简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境 ...
- Git Windows客户端保存用户名和密码
解决Git Windows客户端保存用户名和密码的方法,至于为什么,就不想说了. 1. 添加一个HOME环境变量,值为%USERPROFILE% 2. 开始菜单中,点击“运行”,输入“%Home%”并 ...
- TortoiseGit+msysgit保存用户名和密码
本文以windows系统为例 保存用户名和密码 在C盘的c:\Users**qing** (或可能是C:\Users\Administrator) (替换自己的用户名)找到.gitconfig, 如果 ...
- cookie保存用户名及密码
登陆页中,用户输入用户名密码,点击提交,后台对照mysq数据库中,看是否有对应的用户名,以及密码是否正确.如果正确 则将用户名密码分两份Cookie保存.页面跳转到登陆成功页. 用户再次访问登陆页时, ...
- Git Windows客户端保存用户名与密码
1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的文件. 3. 用记事本打开_n ...
- 终于解决“Git Windows客户端保存用户名与密码”的问题
这就是正确答案,我们已经验证过了,下面详细描述一下解决方法: 1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home% ...
随机推荐
- `cocos2dx非完整`开篇
相信每个人都有一些自己的项目开发习惯,在·开篇·中我主要是会提到一些项目的配置问题.无论做一款什么样的手游项目,我们总是会从需求的角度出发去选择开发引擎,开发工具等一些列的工具去完善我们的开发环境.当 ...
- 爬虫技术 -- 基础学习(四)HtmlParser基本认识
利用爬虫技术获取网页源代码后,针对网页抽取出它的特定文本内容,利用正则表达式和抽取工具,能够更好地抽取这些内容. 下面介绍一种抽取工具 -- HtmlParser HtmlParser是一个用来解析H ...
- 云计算之路-阿里云上:消灭“黑色n秒”第二招——给w3wp进程指定CPU核
虽然昨天的第一招失败了,但是从失败中我们学到了与多核CPU相关的Processor Affinity(处理器关联)的知识. 既然我们可以让.NET程序的不同线程运行于指定的CPU核,那是不是也可以让I ...
- iOS-图片轮播-SDCycleSCrollView的使用
介绍: SDCycleScrollView 是一款非常强大的轮播图第三方. 轮播流畅,手滑流畅.使用方便.自定义简单. 可以更改pageControl. 一. Demo地址 https://pan.b ...
- nodejs morgan包
新建app.js var express = require('express') var logger = require('morgan') var app = express() app.use ...
- 从IE6到IE11上运行WebGL 3D遇到的各种坑
这篇<基于HTML5的电信网管3D机房监控应用>基于WebGL技术的应用让少同学对HTML5 3D的应用产生了兴趣和信心,但有不少网友私信询问WebGL如何运行在老的IE678910浏览器 ...
- SQL SERVER2008及以上版本数据库自动备份的三种方法
方法一:创建一个维护计划对数据库进行备份 方法二:创建一个SQL作业对数据库进行备份 方法三:创建WINDOWS任务计划对数据库进行备份 方法一与方法二其实原理基本相同,都必需开启SQL代理服务,都会 ...
- zabbix配fpmmm(mpm)数据传送不了问题解决
我们环境用zabbix mpm来监控mysql,不过最近官网已经不叫mpm了,而是叫fpmmm,理由为: fpmmm is the successor of mpm. mpm was renamed ...
- mysql修改definer方法
-- 函数.存储过程 select definer from mysql.proc; update mysql.proc set definer='billing@%'; -- 定时事件 sele ...
- SCRUM项目 4.0
4.0----------------------------------------------- 1.准备看板. 形式参考图4. 2.任务认领,并把认领人标注在看板上的任务标签上. 先由个人主动领 ...