魏艳鸣
摘要:随着Android智能手机平台的广泛应用,在其平台下开发的手机应用程序大大的便利了人们的生活。该文利用聚合数据网提供的JSON新闻数据,设计与开发了一款能查看不同类型的新闻阅读器。
关键词:聚合数据;OKHttp;JSON;ListView
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)07-0084-02
1概述
随着网络的快速发展和高性能手机的普及,微信、导航等手机应用程序大大便利了人们的生活[1]。目前,手机应用程序的开发平台主要包括苹果的IOS、Google的Android、微软的Win7和诺基亚的Symbian等,其中,Android操作系统因其稳定性、开源性、低成本等特点,成为当今社会主流的一款操作系统,也是国内用户群最大的操作系统。本文的主要目的是设计与开发一款基于Android的新闻阅读器App,用户可以利用此App查看不同类型的新闻头条。
2所用技术
2.1数据来源
聚合数据(www.juhe.cn)是一家数据银行,提供30大类,100种以上的基础数据API服务,如天气预报、手机号码归属地、新闻头条等,是国内最大的基础数据API服务提供商之一。
使用聚合数据API服务需先进行注册,注册成功后,可以在“个人中心”à“我的数据”平台下点击“申请新数据”按钮申请免费数据,但在获取部分免费数据时需要上传身份证照片进行实名认证,认证通过后,会获取访问的AppKEY,如图1所示。可以使用“http://v.juhe.cn/toutiao/index?type=top&key;=APPKEY”访问此网站API服务提供的数据,其中type是新闻类型,取值top(头条,默认)、shehui(社会)、guonei(国内)、guoji(国际)等。
2.2网络连接与访问
Android中提供了一个用于访问网络的基础类HttpURLConnection,但用此類访问网络数据,代码量较大,需要对获取的数据进行处理才能转换为所需的字符串,因此在其基础上又衍生了许多第三方库,如OKHttp。OKHttp是一款高效的HTTP客户端,具有以下优势:
1) 支持连接同一地址的链接共享同一个socket;
2) 通过连接池来减小响应延迟;
3) 无缝的支持GZIP来减少数据流量;
4) 缓存响应数据来减少重复的网络请求等。
在项目中使用OKHttp时需添加依赖,即在build.gradle文件中添加:
compile 'com.squareup.okhttp3:okhttp:3.0.1'
可以通过以下代码完成对网络的GET请求及访问,其中String jsonData即为我们要获取的网络数据。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().get()
.url(url).build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()){
String jsonData = response.body().string();
}
在此需要注意,由于Android4.0之后,访问网络的代码只能放在子线程中,因此上面一段代码需放置到一个线程中。
2.3 数据解析
本文从聚合数据网中获取的新闻数据为JSON格式,其主要格式如下所示。
{
"reason": "成功的返回",
"result": {
"stat": "1",
"data": [
{
"uniquekey": "6c4caa0c3ba6e05e2a272892af43c00e",
"title": "发际线再也回不去了么?…",
"date": "2017-01-05 11:03",
"category": "yule",
"author_name": "腾讯娱乐",
"url": "http://mini.eastday.com/mobile/170105110355287.html?qid=juheshuju",
"thumbnail_pic_s": "http://03.imgmini.eastday.com/mobile/20170105/20170105110355_
806f4ed3fe71d04fa452783d6736a02b_1_mwpm_03200403.jpeg",…},
...]}}
JSON是存储和交换文本信息的语言,类似 XML,但JSON 比 XML 更小、更快,更易解析。其中“{}”表示对象,用“[]”表示数组,由这两种数据嵌套可组成各种复杂数据。对JSON解析可以使第三方库,如GSON,也可以使用Android中提供的最基础的JSON解析工具,即JSONObject和JSONArray,本文使用后者。针对从聚合中获取的JSON数据,我们可以用以下代码进行解析,解析的数据封装在List集合datas中,方便后期显示在相应控件里。
private ArrayList
List
try {
JSONObject o1 = new JSONObject(jsonData);
if (o1.getString("reason").equals("成功的返回")){
JSONObject o2 = o1.getJSONObject("result");
JSONArray array = o2.getJSONArray("data");
for (int i = 0; i < array.length(); i++) {
JSONObject o = array.getJSONObject(i);
NewsInfo data = new NewsInfo();
data.title = o.getString("title");
data.date = o.getString("date");
data.url = o.getString("url");
data.thumbnail_pic_s = o.getString("thumbnail_pic_s");
datas.add(data); }
return (ArrayList
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
2.4顯示数据
新闻最终以列表的形式显示在界面上,本文使用ListView控件[2]显示新闻列表,当数据过多时ListView会出现滚动条,并且能够根据数据的长度自适应屏幕显示。使用ListView控件时需要进行数据适配,这样才会在界面上显示数据,数据适配器就是数据与视图之间的桥梁,本文使用继承BaseAdapter的自定义数据适配器。此外,当单击新闻列表项时,需要进入新闻详情界面,这就需要给ListView控件添加OnItemClickListener监听。
3系统实现
在Android4.0以后规定,子线程不能修改主线程的UI界面,因此在MainActivity中,使用Handler消息机制完成不同线程之间的通信,最终完成系统显示的界面,如图2和图3所示。
4总结
本文利用聚合网提供的JSON新闻数据,开发了一款能查看不同类型的新闻阅读器,通过OKHttp访问网络,使用JSONObject和JSONArray解析数据,最终把数据以列表的形式显示到ListView控件中。
参考文献:
[1] 季光献.Android系统环境下应用前景与开发研究[J].软件,2011,32(10).
[2] 谢景明.Android移动开发基础案例教程[M].北京:人民邮电出版社,2017:139-146.