android做新闻客户端用到得第三包

来源:互联网 发布:淘宝的钻石展位是什么 编辑:程序博客网 时间:2024/05/22 02:17

在处理的数据越来越大、越多的时候,以前自己写的那套小空间已经不在适合了,而且封装性也总不尽完美,所以第三包的运用就出现了,首先是网络获取图片,以前自己的图片地址从死地址到网络少量JSON数据的解析,还看不出什么差别,到后面越来越多的图片的时候,加载图片就显示不尽人意了,第一个第三方包是picasso,只是简单的看了,感觉和自己封装的都差不多,只不过自己只加了文件缓存和那个LRUCache缓存,能作为第三方包,功能肯定是强大的,后面就用的volley框架,感觉效率的提升很明显,他里面至少会开启2个死线程,无限的循环,一个是缓存的线程,一个是网络取数据的线程,下来刷新,上拉加载更多用的是很常见XListView,图片的异步取数据,然后自动滚动显示的ImageSlider,侧滑的slidingMenu,用这些工具,差不多做了半个新闻客户端的主要一些效果,其中主要的操作时联网取数据,然后JSON解析,Tab和viewPager的结合使用,防止图片错位等,ListView中的item显示多种效果。上一张效果图:

 

其中遇到一个以后肯定会遇到的问题,就是第三方jar包重复的问题,很多都是V4包或者解析JSON数据的包:Gson、fastjson等重复,因为在第三方包里面已经用到了,所以我们再添加就会出现重复的问题,可以直接删掉,或者点工程右键的最后一排(Preperties),然后选java buid path,选中它里面的第三个,如果有报错的删了就行,有时候就删不掉,我今天就是,一直说已经打开,然后直接关掉开发的工具,去工作空间删的。

中间解析数据的时候我一开始用的GSON解析,感觉这个方式挺好的,但是第一次解析完,遇到了情况,应该是运气好,一运行出来没有崩溃,然后上拉加载更多就崩溃了,后来经人指点原来我们GSON解析的那个Bean类里面的设置的必须是你解析的那个数据源里面,每个对象都有的,也就是说那个Bean类里面是公共的部分,你如果添加有些里面有这个地址的,有些却没有的,那么不用看,肯定会报错,就像上图中的,横排的3张图,和一张图的item中就有差别,我一开始也想过判断它不为空我就去添加数据,唯恐我就不添加数据,但是Gson确不干,就是要说,解析对象里面有错直接崩掉,我最后选择的还是系统的解析方式。

界面的话,采用的是一个Activity4个fragment,本来想一个fragment解决;但是后来发现这个和viewpager冲突,因为我左右滑动下一页的时候,要的是一个界面,所以最后被逼无奈就复制了3个fragment出来,做4个fragment算了,或许2个fragment可以解决,滑动到下一页,就只刷新数据源,添加到适配器去显示,至少左右滑的时候能保证有界面出来,这个估计常见的就是图片错位,新闻重复方面的问题了。另外我的侧滑设置在左边,只能从边缘处滑出来,否则会和viewPager的滑动冲突。一开始一个fragment的时候我想用广播通知TAB的fragment和Viewpager的fragment状态改变,后面想了下,估计是自己想疯了,fragment划过去都和activity已经解绑了,还能收到才怪了。

在这里面还用到了一个异常的捕捉,我用的很简单捕捉就完了,啥都没处理,就是防止程序因为取数据,或者网络超时什么的直接给你崩溃掉,就是用一个类继承异常的父类Exception:

然后如下:

public class MsgException extends Exception {public MsgException(String msg) {super(msg);}}

下面是我捕获的地方,当然还得有接口回调取通知我们的界面:

public String httpGetByJson(String url) throws MsgException {String contentString = "";try {HttpClient httpClient = new DefaultHttpClient();HttpGet httpGet = new HttpGet(url);// 设置请求超时15秒钟HttpConnectionParams.setConnectionTimeout(new BasicHttpParams(),15000);// 设置等待数据超时时间10秒钟HttpConnectionParams.setSoTimeout(new BasicHttpParams(), 10000);HttpResponse responese = httpClient.execute(httpGet);int n = responese.getStatusLine().getStatusCode();if (n == 200) {contentString = EntityUtils.toString(responese.getEntity());//SharedPrefrences暂时存储最新的新闻
                                     setSharedPrefrenceJSON(url, contentString);return contentString;} else {contentString = "服务器连接异常";}} catch (IOException e) {
                           //这个就是我捕获的异常<span style="color:#ff0000;">throw new MsgException("网络连接异常,请检查你的网络!");</span>}return contentString;}

然后就是异步线程开启调用的地方处理就行了,至于实现接口后处不处理随个人了:

new AsyncTask<String, Void, String>() {protected String doInBackground(String... params) {String line = "";try {line = httpGetByJson(params[0]);} catch (MsgException e) {e.printStackTrace();
                                             //用的接口回调来处理网络获取出错的异常mBackMsgByAsynctask.exceptionMsg(e.getMessage());}return line;}


新闻的话,要缓存的话就用SharedPrefrences缓存下,因为新闻看了一遍,或许看都没看,都不会再去看了,没要浪费内存区存储。大概差不多这么多把。


 

 

 

0 0