哈哈最近工作比较忙很久没写博客了。虽然没几个人看,但是当做自己知识的整合吧。
本篇主要是讲android研发中的缓存问题。缓存一般就是将第一次请求的数据保存到本地,保存到本地有三种方式,第一存到手机的数据库中,二存到SharedPreferences中,三是存到本地新建的文件夹中。一下是存储在SharedPreferences和本地新建的文件夹中。
一、存储到SharedPreferences
public class MainActivity extends AppCompatActivity { TextView show; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show= (TextView) findViewById(R.id.show); } /*** * 序列化对象 * @param person * @return */ private String serialize(Person person){ String serStr=null; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(person); serStr = byteArrayOutputStream.toString("ISO-8859-1"); serStr = java.net.URLEncoder.encode(serStr, "UTF-8"); objectOutputStream.close(); byteArrayOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } return serStr; } /** * 反序列化对象 * @param str * @return */ private Person deSerialization(String str){ String redStr = null; Person person=null; try { redStr = java.net.URLDecoder.decode(str, "UTF-8"); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(redStr.getBytes("ISO-8859-1")); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); person = (Person) objectInputStream.readObject(); objectInputStream.close(); byteArrayInputStream.close(); } catch (Exception e) { e.printStackTrace(); } return person; } void saveObject(String strObject) { SharedPreferences sp = getSharedPreferences("person", 0); SharedPreferences.Editor edit = sp.edit(); edit.putString("person", strObject); edit.commit(); } String getObject() { SharedPreferences sp = getSharedPreferences("person", 0); return sp.getString("person", null); } public void onclick(View v) { switch (v.getId()) { case R.id.button1: saveObject(serialize(new Person("小白",20,"朝阳"))); break; case R.id.button2: Person person = deSerialization(getObject()); show.setText(person.toString()); break; default: break; } } }saveObject中的序列化,将ByteArrayOutputStream管道怼到ObjectOutputStream管道上便于直接将对象写入。这里的IOS8859-1和UTF-8是为了保证对象不出现乱码。解序列化的时候也要用到。将对象输出流以字符串的形式返回。然后通过SharePreference存储。序列化的对象必须继承Serializable接口,必须继承Serializable接口,必须继承Serializable接口,重要是事情说三遍。解序列化则是按照编码格式及存储对象相应的解析。跟序列化的部分相对应,in--out流相对应。所有的流在用完的时候一定要关闭。不然会造成内存溢出。
将对象存储在本地文件。
读取本地文件时首先要在配置文件中赋权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
public class TestActivity extends Activity{ TextView show; HashMap<String,List> map=new HashMap<String,List>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show= (TextView) findViewById(R.id.show); } public void onclick(View v){ switch (v.getId()){ case R.id.button1: save(); break; case R.id.button2: Map<String,List> map=show(); List<Person> persons=map.get("person"); List<User> users=map.get("user"); StringBuilder sb=new StringBuilder(); for(int i=0;i<persons.size();i++){ sb.append(persons.get(i).toString()+"\n"); } for(int i=0;i<users.size();i++){ sb.append(users.get(i).toString()+"\n"); } show.setText(sb.toString()); break; } } public void save(){ try{ File dir = new File(getSDPath()+"/test/"); if(!dir.exists()){ dir.mkdirs(); } File file=new File(getSDPath()+"/test/recommend"); if (!file.exists()) { //在指定的文件夹中创建文件 file.createNewFile(); } FileOutputStream out; out = new FileOutputStream(file); ObjectOutputStream objOut=new ObjectOutputStream(out); List<Person> list=new ArrayList<Person>(); list.add(new Person("小白",17,"北京")); list.add(new Person("小红",18,"上海")); list.add(new Person("小兰",19,"广州")); map.put("person",list); List<User> list1=new ArrayList<User>(); list1.add(new User("小黑",20)); list1.add(new User("二狗",21)); list1.add(new User("狗蛋",22)); map.put("user",list1); objOut.writeObject(map); objOut.flush(); objOut.close(); }catch (Exception e){ e.printStackTrace(); } } public Map<String,List> show(){ Map<String,List> temp=null; File file =new File(getSDPath()+"/test/recommend"); FileInputStream in; try { in = new FileInputStream(file); ObjectInputStream objIn=new ObjectInputStream(in); temp= (Map<String, List>) objIn.readObject(); objIn.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return temp; } public String getSDPath() { File sdDir=null; boolean sdCardExist = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); //判断sd卡是否存在*/ if (sdCardExist) { sdDir = Environment.getExternalStorageDirectory();//获取跟目录 } else { Toast.makeText(TestActivity.this,"没有sd卡",Toast.LENGTH_SHORT).show(); } return sdDir.toString(); } }这里在save的时候先判断手机是否有sd卡。然后在sd卡下新建一个文件夹然后再新建文件。在实验过程中如果遇到地址不是个文件夹等错误建议去手机相应目录下看是不是又干扰文件之类的。这里直接用ObjectOutputStream写入就行。结束别忘把流给关了。这里的对象是一个Map是为了存储更多不同对象的数据。将对象名作为唯一识别的key将list对象的具体数据列表作为map的值存储。读取时直接通过ObjectInputStream来读取即可,然后将读取的内容显示到activity_main上。
这个项目主要是通过save和show两个按钮来实现存储和查看数据的。其他方面大家可以自己添加。
希望这个项目对你们有用。