Android离线缓存

android做到一定程度,需要考虑缓存的问题,不信可以掏出手机看看淘宝等一些app是否无网的情况下还可以浏览,不过大部分app并没有考虑到这些问题,解决Android的缓存有哪些方法呢

1.IO流读写文件

2.数据库

3.LruCache和DiskLruCache

个人比较喜欢sd卡文件读写的方式,原因自己可以去分析。

(1)权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>(2)判断网络连接的状态,有什么用呢?自己想
if (isNetworkAvailable(MainActivity.this)) {    Toast.makeText(getApplicationContext(), "当前有可用网络!", Toast.LENGTH_LONG).show();

} else {    Toast.makeText(getApplicationContext(), "当前wu可用网络!", Toast.LENGTH_LONG).show();}
public boolean isNetworkAvailable(Activity activity){    Context context = activity.getApplicationContext();    // 获取手机所有连接管理对象(包括对wi-fi,net等连接的管理)    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

if (connectivityManager == null)    {        return false;    }    else    {        // 获取NetworkInfo对象        NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();

if (networkInfo != null && networkInfo.length > 0)        {            for (int i = 0; i < networkInfo.length; i++)            {                System.out.println(i + "===状态===" + networkInfo[i].getState());                System.out.println(i + "===类型===" + networkInfo[i].getTypeName());                // 判断当前网络状态是否为连接状态                if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED)                {                    return true;                }            }        }    }    return false;}

(3)端口写入数据
    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){    File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录    File saveFile = new File(sdCardDir, "itcast.txt");    FileOutputStream outStream = new FileOutputStream(saveFile);    outStream.write(result.getBytes());    outStream.close();}(4)读取数据
File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录File saveFile1   = new File(sdCardDir, "itcast.txt");BufferedReader br = null;try {    br = new BufferedReader(new FileReader(saveFile1));    String readline = "";    StringBuffer sb = new StringBuffer();    while ((readline = br.readLine()) != null) {        System.out.println("readline:" + readline);        sb.append(readline);    }    String str = sb.toString();(5)部分完整demo1
if (isNetworkAvailable(MainActivity.this)) {    Toast.makeText(getApplicationContext(), "当前有可用网络!", Toast.LENGTH_LONG).show();

} else {    Toast.makeText(getApplicationContext(), "当前wu可用网络!", Toast.LENGTH_LONG).show();    File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录    File saveFile1   = new File(sdCardDir, "itcast.txt");    BufferedReader br = null;    try {        br = new BufferedReader(new FileReader(saveFile1));        String readline = "";        StringBuffer sb = new StringBuffer();        while ((readline = br.readLine()) != null) {            System.out.println("readline:" + readline);            sb.append(readline);        }        String str = sb.toString();        JSONObject jsonObject = new JSONObject(str);        JSONArray jsonArray = jsonObject.getJSONArray("data");        for (int i = 0; i < jsonArray.length(); i++) {            JSONObject object = jsonArray.getJSONObject(i);            String title = object.getString("name");            String content = object.getString("description");            String url = object.getString("picSmall");            domainBean newsInfo = new domainBean(title, content, url);

//String path = Environment.getExternalStorageDirectory() + "/" +  name;            //ObjectOutputStream out =new ObjectOutputStream(new FileOutputStream(path));            //out.writeObject(newsInfo);            list.add(newsInfo);            //新建适配器            beanAdapter = new BeanAdapter(list, MainActivity.this);            //配置适配器            xListView.setAdapter(beanAdapter);            br.close();

}

} catch (IOException e) {        e.printStackTrace();    } catch (JSONException e) {        e.printStackTrace();    }}
(6)部分完整demo2
 public String logoutPost(String URL){        String result = "";        try {            String data = URLEncoder.encode("UTF-8");// + "&password=" + URLEncoder.encode(password, "UTF-8");//传递的数据            URL url = new URL(URL);//2、url.openConnection()打开网络链接            HttpURLConnection conn = (HttpURLConnection) url.openConnection();//3、设置请求的方式            conn.setRequestMethod("POST");            conn.setDoInput(true);//发送POST请求必须设置允许输出            conn.setDoOutput(true);//发送POST请求必须设置允许输入            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");            conn.setRequestProperty("Charset", "utf-8");            conn.setRequestProperty("Content-Length", String.valueOf(data.getBytes().length));//5、获取输出流            OutputStream os = conn.getOutputStream();            os.write(data.getBytes());            os.flush();            BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream()));            String line;            while((line=in.readLine())!=null){result+="\n"+line;}                        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){                File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录                File saveFile = new File(sdCardDir, "itcast.txt");                FileOutputStream outStream = new FileOutputStream(saveFile);                outStream.write(result.getBytes());                outStream.close();            }        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (ProtocolException e) {            e.printStackTrace();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }

return result;    }
				
时间: 2024-08-07 08:40:35

Android离线缓存的相关文章

Android 离线缓存的快速实现

离线缓存是指在有网络的状态下将从服务器获取的网络数据,如Json 数据缓存到本地,在断网的状态下启动APP时读取本地缓存数据显示在界面上,常用的APP(网易新闻.知乎等等)都是支持离线缓存的,这样带来了更好的用户体验. 如果能够在调用网络接口后自动缓存返回的Json数据,下次在断网状态下调用这个接口获取到缓存的Json数据的话,那该多好呢?Volley做到了这一点. 因此,今天这篇文章介绍的就是使用Volley自带的数据缓存,配合Universal-ImageLoader的图片缓存,实现断网状态

android 离线缓存数据

我们在看一些做的比较好的app时,当没网情况下它的第一层界面都是有数据,像很多电商类的app,如图: 这是它的主界面,我现在是在没网络的情况下进来的,但是依然可以展示原来的数据,这些数据还有图片,当然是使用了缓存,所说的第一层缓存,就是比如说 精华,明星,美容,等等这些第一个界面,当点击进去就不会显示数据了,如果不缓存的话用户进来就啥都看不见,用户体验就不是太好,移动互联年代,用户体验被提到了很高的高度,因为如果一个app用户很多的,即使这公司没有盈利,但依然有很强的市场,对公司下一步的融资也是

Android之 -WebView实现离线缓存阅读

前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有点脑子的人都知道没有网络之后怎么下载呢?所以离线下载这个功能是”在有网络的情况下,把资源下载到本地“,离线阅读就是”在没有网络或者网络不好的时候,阅读本地好缓存的文章资源“.这样就很清楚我们要的这两个具体的功能需求了. 实现思路 小巫这里提供两个实现思路,一个就是自己写逻辑,一个是通过WebView

android中如何实现离线缓存

离线缓存就是在网络畅通的情况下将从服务器收到的数据保存到本地,当网络断开之后直接读取本地文件中的数据. 将网络数据保存到本地: 你可以自己写一个保存数据成本地文件的方法,保存在android系统的任意目录(当然是有权限的才行),但是在这种情况下使用Context的openFileOutput方法最简便也最符合我们的场景,下面的saveObject方法演示了如何用openFileOutput将数据保存在本地的一个文件中: saveObject public static boolean saveO

Android记录25-WebView实现离线缓存阅读

Android记录25-WebView实现离线缓存阅读 前言 本篇博客要实现的是一个离线下载和离线阅读的功能,这是很多阅读类app都常见的一个功能,典型的应用就是网易新闻.什么是离线下载?其实这个概念是比较模糊,是离线之后下载呢,还是下载之后离线,但稍微有点脑子的人都知道没有网络之后怎么下载呢?所以离线下载这个功能是"在有网络的情况下,把资源下载到本地",离线阅读就是"在没有网络或者网络不好的时候,阅读本地好缓存的文章资源".这样就很清楚我们要的这两个具体的功能需求

【转】android中如何实现离线缓存

原文地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1209/2136.html 离线缓存就是在网络畅通的情况下将从服务器收到的数据保存到本地,当网络断开之后直接读取本地文件中的数据. 将网络数据保存到本地: 你可以自己写一个保存数据成本地文件的方法,保存在android系统的任意目录(当然是有权限的才行),但是在这种情况下使用Context的openFileOutput方法最简便也最符合我们的场景,下面的saveObj

HTML5离线缓存(Application Cache)

HTML5离线缓存又名Application Cache,是从浏览器的缓存中分出来的一块缓存区,要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源. Manifest 文件 manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容). manifest 文件可分为三个部分: CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存 NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓

【转】Retrofit 源码解读之离线缓存策略的实现

Retrofit 源码解读之离线缓存策略的实现 Retrofit 是square公司开发的一款网络框架,也是至今Android网络请求中最火的一个,配合OkHttp+RxJava+Retrofit三剑客更是如鱼得水,公司项目重构时,我也在第一时间使用了RxJava+Retrofit,使用过程中遇到的一些问题,也会在后续的博客中,一点点分享出来,供大家参考! 在项目的过程中,项目需求需要在离线的情况下能够继续浏览app内容,第一时间想到缓存,于是经过各种google搜索,得出以下结论(使用Retr

ArcGIS for Android离线数据编辑实现原理

来自:http://blog.csdn.net/arcgis_mobile/article/details/7565877 ArcGIS for Android中现已经提供了离线缓存图片的加载功能,极大的提高了我们访问地图的效率,对于离线的数据编辑暂时还不支持,而现在对于离线数据编辑操作的需求越来越多,那我们如何才能实现离线数据编辑功能呢?下面我们介绍一下,通过sqlite来实现离线数据编辑的解决方案.     一.离线数据编辑解决方案 离线编辑无非就是将所需的数据下载到我们的手持端进行存储,当