一、源码地址:https://github.com/ambition-hb/News_1
二、部分内容效果图如下:
(1)广告页面
(2)新闻界面
(3)热点新闻
(4)热点新闻详情界面
(5)新闻页面栏目切换
(6)跟帖页面
三、内容详解
1、广告页面
包含Commits-1→Commits-6,详细步骤如下:
(1)创建一个工程,创建MainActivity并创建其对应的布局文件activity_main.xml,在splash.activity包下创建SplashActivity,并创建其对应的布局文件activity_splash.xml,在styles.xml文件中取消顶部的ActionBar(修改默认样式,将默认样式的父样式改为NoActionBar),在SplashActivity内设置全屏显示
(2)明确广告页面需要实现的功能:①通过OkHttp的异步方式来请求过场动画的广告数据②为了节省用户流量,我们下载广告图片到本地③实现点击广告跳转至指定的H5页面④自定义倒计时控件
(3)为应用增加网络权限,使用开源的OkHttp控件(在build.gradle中引入依赖→compile ‘com.squareup.okhttp3:okhttp:3.4.1’),并在SplashActivity中编写一个异步请求方法:httpRequest()
(4)获取到请求数据后,我们使用GSON(在build.gradle中引入依赖→compile ‘com.google.code.gson:gson:2.7’)对其进行解析,在Splash.bean包下编写Action、Ads、AdsDetail三个文件并进行对对象进行序列化操作(实现Serializable接口,将对象转化为数据流),编写json解析工具类(在util包下新建JsonUtil工具类来解析json,使用泛型来提供通用性)
(5)在util包下新建常量类Constant,存储广告页面的url与缓存文件名,解析成功数据,由于Service不能处理耗时操作,我们使用IntentService(在service包下新建DownloadImageService文件)开始下载图片,为下一次的使用做准备
(6)在下载的时候需要根据url判断图片是否下载,防止图片二次下载,浪费流量,在showImage()方法里对图片进行处理,我们使用一个MD5工具类(在util包下新建Md5Helper,使用MD5算法对传入的key进行加密并返回),将每一张图片的地址转化为名称
(7)在下载图片的过程中(在DownloadImageService的onHandleIntent()方法中),首先我们将一获取到的url生成一个bitmap,再编写saveToSD方法将它缓存到sd卡上(缓存目录采用“.xxx”是为了隐藏文件夹,防止一般用户误删除),为应用添加读写权限
(8)在Util包下编写ImageUtil工具类文件,先判断图片是否存在再判断文件内容是否完整,如果存在则不下载
(9)能够下载图片后,编写处理显示图片的逻辑,首先在util包下编写SharePrenceUtil工具类,为了考虑效率,不需要每次去调用接口,我们将接口返回的数据进行缓存,采用SharedPreference进行缓存
(10)在SplashActivity中添加getAds()方法,修改请求http的逻辑,判断是否需要http请求:①如果没有缓存,请求http②如果超时了,我们也请求http,缓存中的超时时间是小时,转化成毫秒需要6060*1000,在计算时间时,防止溢出
(11)完善广告页面的布局(activity_splash.xml),显示界面,并在SPlashActivity中编写showImage()方法,编写显示图片的逻辑:我们请求网络成功后,就会缓存接口的数据,我们需要显示的图片首先要将接口的信息读出,接着根据接口信息转化成Md5的文件名称,再根据文件名称加载图片,为了实现每次打开应用后显示图片不一样,我们实现轮播图效果,在显示图片前先去获取上次显示的图片的角标,默认是第一张,当显示成功后,我们将角标指向下一张图片,并缓存,但是这种实现容易越界,我们采用取余的方式处理越界
(12)处理完越界后,已经实现了显示图片的功能,接着为图片增加点击事件(每一个广告页面点击后会跳转到下一个activity(h5页面)),为了避免跳转到系统的浏览器,我们重写的跳转的方法,在splash.activity包下新建一个WebViewActivity并创建其对应的布局文件activity_webview.xml,设置全屏显示并处理url重定向问题(使其不要抛到系统浏览器),并且在WebViewActivity中添加onBackPressed()方法,使webview能够回退到上一个页面
(13)开始编写圆形控件,在splash包下新建TimeView类,初始化控件的画