接上文: 妹子图APP(三)—— RecyclerView的Item点击事件和图片保存至本地
前面实现了加载网络图片并保存至本地,但无法实现离线查看已缓存的图片,现在需要实现离线查看缓存的图片
Glie在加载图片时已经实现三级缓存了,所以现在只需要使用SQLite将图片地址保存,无网络时加载SQLite数据即可
1.判断有无网络连接
新建一个工具类,判断是否联网
public class Network {//除了判断是否有网络,还写工具方法判断网络为什么类型 2G、3G、4G、wifi此处忽略public static boolean checkNetworkState(Context context) {//得到网络信息ConnectivityManager manager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo info = manager.getActiveNetworkInfo();if (info != null && info.isAvailable()) {//当前的网络是连接的return true;} else {return false;}}
}
记得加上权限
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/>
2.SQLite数据库的操作
2.1创建一个类继承SQLiteOpenHelper实现对数据库进行版本管理
public class MySqliteOpenHelper extends SQLiteOpenHelper{//数据库名称private static final String name = "girl.db";//数据库版本private static final int version = 1;public static final String tableNmae = "girls";public MySqliteOpenHelper(Context context) {//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类super(context, name, null, version);}//用于初次使用软件时生成数据库表@Overridepublic void onCreate(SQLiteDatabase db) {/*** 图片的所以属性* title : 清纯气质韩国美女沙滩写真* picUrl : http://t1.du114.com/uploads/151201/10-1512011521415N.jpg* description : 114美女* ctime : 2016-03-06 14:11* url : http://www.du114.com/qingchun/66307.html*///执行SQL语句 创建表 此处注意table后的空格 不然语句就成了tablegirls而报错db.execSQL("create table " + tableNmae + "(id integer primary key autoincrement,title text," +"picUrl text,description text,ctime text,url text)");}//用于升级软件时更新数据库表结构@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
2.2使用SQLiteDatabase操作SQLite数据库
public class GirlImageDao {MySqliteOpenHelper mHelper;public GirlImageDao(Context context) {mHelper = new MySqliteOpenHelper(context);}//向数据库中添加数据 即NewslistBean对象public void addGirl(GirlsBean.ShowapiResBodyBean.NewslistBean bean) {//Android提供了一个名为SQLiteDatabase的类,该类封装了一些操作数据库的API,//该类可以对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(简称为CRUD)SQLiteDatabase db = mHelper.getReadableDatabase();ContentValues values = new ContentValues();//存入图片的Url地址values.put("title", bean.getTitle());values.put("picUrl", bean.getPicUrl());values.put("description", bean.getDescription());values.put("ctime", bean.getCtime());values.put("url", bean.getUrl());//向表中插入数据db.insert(MySqliteOpenHelper.tableNmae, null, values);db.close();}//for循环遍历girl集合,将每个图片地址挨个插入数据库public void addGirlList(List<GirlsBean.ShowapiResBodyBean.NewslistBean> list) {for (GirlsBean.ShowapiResBodyBean.NewslistBean bean : list) {addGirl(bean);}}//查询SQLite取出数据存入集合public List<GirlsBean.ShowapiResBodyBean.NewslistBean> queryAllGirls() {List<GirlsBean.ShowapiResBodyBean.NewslistBean> list = new ArrayList<>();SQLiteDatabase db = mHelper.getReadableDatabase();//Cursor是结果集游标,用于对结果集进行随机访问,Cursor与JDBC中的ResultSet作用很相似。Cursor cursor = db.query(MySqliteOpenHelper.tableNmae,null,null,null,null,null,null);//moveToNext()方法可以将游标从当前行移到下一行,如果移过了结果集的最后一行,返回结果为false,否则为truewhile (cursor.moveToNext()) {GirlsBean.ShowapiResBodyBean.NewslistBean bean =new GirlsBean.ShowapiResBodyBean.NewslistBean();//通过key 得到图片地址值valuebean.setTitle(cursor.getString(cursor.getColumnIndex("title")));bean.setPicUrl(cursor.getString(cursor.getColumnIndex("picUrl")));bean.setDescription(cursor.getString(cursor.getColumnIndex("description")));bean.setCtime(cursor.getString(cursor.getColumnIndex("ctime")));bean.setUrl(cursor.getString(cursor.getColumnIndex("url")));//将NewslistBean对象加入集合list.add(bean);}return list;}
}
3.MainActivity中调用数据库操作方法
3.1当从网络请求数据成功后将数据存入数据库,即在网络请求回掉方法OnFish()中调用存数据方法
    @Overridepublic void onFinish(GirlsBean data) {
//        //得到适配器
//        mAdapter = new MyAdapter(this,data.getShowapi_res_body().getNewslist());
//        //设置适配器
//        mRecyclerView.setAdapter(mAdapter);
//        //RecyclerView设置Item的点击事件
//        mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
//
//            @Override
//            public void onItemClick(String data) {
//                //跳转显示详细图片的Activity
//                Intent intent = new Intent(MainActivity.this, ImageShowActivity.class);
//                intent.putExtra("data",data);
//                startActivity(intent);
//            }
//        });//存储数据GirlImageDao dao = new GirlImageDao(this);dao.addGirlList(data.getShowapi_res_body().getNewslist());}
3.2当无网络时读取数据库的数据进行加载本地缓存的图片
 //是否联网boolean isNetwork;isNetwork = Network.checkNetworkState(this);//判断是否联网,选择数据的加载方式if (isNetwork) {//如果有网络,调用getGirlList方法请求数据 1数据请求时的页面mRequest.getGirlList(this,1);} else {//没有网络则加载数据库的数据GirlImageDao dao = new GirlImageDao(this);List<GirlsBean.ShowapiResBodyBean.NewslistBean> list = dao.queryAllGirls();if (list.size() == 0) {//集合数据为0则第一次进入也未联网Toast.makeText(this,"网络连接失败",Toast.LENGTH_SHORT).show();} else {//数据库有数据时候mAdapter = new MyAdapter(this,list);mRecyclerView.setAdapter(mAdapter);}}
在无网络并且数据库也无数据时,需要在Recycler滑动监听里加判断,不然因为没有图片会出空指针异常
3.3当无网络时进入app,然后又开启网络,此时app应该自动加载图片,并改变前面isNetwork的值,因此需要监听网络变化
采用广播的方式
创建一个类继承于BoradcastReceiver 重写方法
    public class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//再次判断有无网络isNetwork = Network.checkNetworkState(MainActivity.this);//如果有网络if (isNetwork) {Toast.makeText(context,"已连接网络",Toast.LENGTH_SHORT).show();//如果有网络,调用getGirlList方法请求数据 1数据请求时的页面mRequest.getGirlList(MainActivity.this,1);}else {Toast.makeText(context,"已断开网络",Toast.LENGTH_SHORT).show();}}}
然后注册广播,在Activity的onCreate()方法中调用
    NetworkChangeReceiver networkChangeReceiver;//注册网络变化广播接收器public void registerNetworkChangeReceiver() {IntentFilter intentFilter = new IntentFilter();//广播的动作类型intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");networkChangeReceiver = new NetworkChangeReceiver();//注册registerReceiver(networkChangeReceiver,intentFilter);}
别忘记取消广播
    //动态注册的广播接收器都要取消@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(networkChangeReceiver);}
以及在AndroidMaindest文件中注册
        <receiver android:name=".activity.MainActivity$NetworkChangeReceiver"><intent-filter><!-- 监听的动作类型,这里是网络连接状态--><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></intent-filter></receiver>
此图片加载Demo基本完成了,让我学了很多知识以及框架的简单用法,感觉加载新闻以及其他简单的数据也是这样步骤
初学者可以在 万维易源-互联网API入口处申请很多数据,自己做简单的天气预报,图片加载,新闻客户端等等。
代码问题很多,因为是初学,想到哪里写到哪里。
加载数据的方法应该抽出来,在里面判断是否联网,取得数据,然后Recycler适配器直接调用数据即可。
详细代码: https://github.com/897532167/LoadNetworkPicture

妹子图APP(四)—— SQLite保存数据实现离线图片查看相关推荐

  1. 妹子图APP(一)—— Retrofit+Glide+Gson加载网络图片

    网络请求:Retrofit    地址: https://github.com/square/retrofit 图片加载:Glide       地址: https://github.com/bump ...

  2. iOS 四种保存数据的方式!

    2019独角兽企业重金招聘Python工程师标准>>> 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊 ...

  3. IOS 四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

  4. 教你用Python爬取妹子图APP

    教你用Python爬美之图APP全站图片 爬取结果 程序只运行了2h,最后认为程序没有问题了就关了(我可不是去杀生去了...... 运行环境 Python 3.5+ Windows 10 VSCode ...

  5. Android使用SQLite保存数据

    要使用SQLite首先要建表,建表要继承SQLiteOpenHelper,如下: package com.example.sqlitedemo4;import android.content.Cont ...

  6. 使用sqlite保存数据返回主键

    /// <summary>/// 返回insert后的主键值/// </summary>/// <param name="SQLString"> ...

  7. App在后台运行时如何保存数据到sqlite数据库

    iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中得数据.因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存数 ...

  8. node sqlite 插入数据_安卓手机中的应用数据都保存在哪些文件中?

    随笔 知识 案例 声音 其他 编者按 手机取证,品牌是一方面,从操作系统入手是另外一个渠道.手机中的重要数据基本上都以轻量数据库的形式保存在本地,也就是经常讲的sqlite db文件中. 从推特上得知 ...

  9. APP如何保存数据?——iOS保存数据的4种方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyed ...

最新文章

  1. 每日一皮:完美的配合...虽然有点怪...
  2. laravel 导出导入excel和csv文件的 使用
  3. 20135202闫佳歆-第二章家庭作业-2.69
  4. 【Linux】一步一步学Linux——domainname命令(172)
  5. oracle 31693,ORACLE expdp备份与ORA-31693、ORA-02354、ORA-01555
  6. python transform(img)_pytorch之ImageFolder使用详解
  7. 基于麻雀算法的投影寻踪模型 - 附代码
  8. 个性化音乐推荐系统 协同过滤推荐算法在在线音乐播放系统中的应用 基于用户/项目的协同过滤推荐算法 混合协同过滤推荐算法 协同过滤混合推荐算法 代码实现开发 程序实现开发
  9. 计算机组成原理第五版(白中英)第六章总线结构 习题
  10. 苏州旅游网站的设计与实现 毕业论文+Html静态源码
  11. ros实现dhcp上网
  12. 防火墙双机热备(应用场景分析及配置)
  13. 标签上title属性与alt属性的区别是什么
  14. 微信双开/微信多开 程序
  15. blender2.8 bpy.data.images.new创建的图片返回值撤回操作后丢失
  16. bzoj1905: Soldier 士兵控制的棋盘
  17. cookie是什么?有什么用?
  18. C++ 多态(动态多态)
  19. 网上订餐管理系统的设计与实现
  20. 0324的学习笔记----里面最重要的就是一个tom猫的动画,和涉及到的内存问题(创建imageview的两种方式,imagenamed就会形成缓存,占用很多内

热门文章

  1. Win10_11使用VMware等启动虚拟机蓝屏报错等一些列问题解决方案
  2. 开发案例---微信定时推送:生日祝福
  3. python 基础语法--print,input,open的内置函数的操作
  4. 缓存穿透、击穿、雪崩
  5. 睢阳区中小学计算机提升培训,商丘市中小学电脑制作活动培训顺利举行
  6. win10重启电脑Java环境变量丢失问题
  7. 洛龙区:加快布局大数据产业
  8. 水果忍者(数学 叉积)
  9. linux 安装 zookeeper
  10. 阿里邮箱备份,引发的小小插曲--2018年6月21日