android开发笔记之网络编程—简易新闻客户端

今天我们来对前面讲过的知识综合运用一下,包括xml的PULL解析,listView的万能适配器等知识。。。。

那先来看一个组件—->智能图片加载器(smart-image-view),它可以很方便的加载一张网络图片。

SmartImageView的设计初衷是来取代Android自带的ImgageView组件,另外它还提供了一些附加功能,如:

支持通过URL来加载图片;

支持从电话簿中加载图片;

异步加载图片;

图片被缓存在内存,以便下次快速加载显示;

SmartImageView类可以被很容易扩展成对其它资源的调用;

而且使用起来非常简单,使用步骤:

①将智能图片加载器的jar包或者源码下载下来。

jar包下载地址:android-smart-image-view-1.0.0.jar

②在xml布局文件中添加一个控件

<com.loopj.android.image.SmartImageView android:id="@+id/my_image" />

③获取引用

SmartImageView myImage = (SmartImageView)this.findViewById(R.id.my_image);

④获取网络图片

myImage.setImageUrl("http://www.awesomeimages.com/myawesomeimage.jpg");

注:

获取网络图片,这个过程本身就是异步。不必再进行处理,也不必担心线程阻塞

网络获取到的图片都进行了缓存的处理。会在程序的cache目录下建/web_image_cache/,图片存在这里

再次使用的时候,如果缓存图片已经存在,则不再从网络获取图片

先看.setImageUrl都有什么方法

1、最普通的一个,直接设置图片地址

// Helpers to set image by URL

public void setImageUrl(String url) {

setImage(new WebImage(url));

}

2、有一个接口,完成下载的时候调用

public void setImageUrl(String url, SmartImageTask.OnCompleteListener completeListener) {

setImage(new WebImage(url), completeListener);

}

3、从字面意思可以看出,是一个备用的资源。如果从网络获取图片失败,则使用备用资源

public void setImageUrl(String url, final Integer fallbackResource) {

setImage(new WebImage(url), fallbackResource);

}

4、类似上面

public void setImageUrl(String url, final Integer fallbackResource, SmartImageTask.OnCompleteListener completeListener) {

setImage(new WebImage(url), fallbackResource, completeListener);

}

5、多了一个loadingResource,就是正在下载的时候展示的图片

public void setImageUrl(String url, final Integer fallbackResource, final Integer loadingResource) {

setImage(new WebImage(url), fallbackResource, loadingResource);

}

6、类似上面

public void setImageUrl(String url, final Integer fallbackResource, final Integer loadingResource, SmartImageTask.OnCompleteListener completeListener) {

setImage(new WebImage(url), fallbackResource, loadingResource, completeListener);

}

接下来我们可以来制作我们的简易新闻客户端了。

效果:

我们可以看到这是一个很简单的新闻客户端,没错,所以叫简易的新闻,主要是为了综合运用一下前面所讲的东西。

下面开始分析:

①首先这个客户端有两个Activity,一个是新闻的列表,用一个ListView来装,另外一个是详情界面,只是将点击的新闻传递下去,没有做太多。

那么第一步就应该把数据获取过来,现在只是测试一下,所以只是将新闻数据放在本地的服务器上。这里采用了HttpURLConnection的方式去想访问服务器。

URL url = new URL(path);
                    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(3000);
                    conn.setReadTimeout(3000);
                    conn.connect();
                    if (conn.getResponseCode() == 200) {
                         InputStream is = conn.getInputStream();
                         //使用PULL解析器解析这个流
                         parseNewsXml(is);
                    }else {
                        Message msg = Message.obtain();
                        msg.what = FAIL;
                        mHandler.sendMessage(msg);
                    }

②这里服务器返回的是xml文件,所以我们应该对这个xml文件进行解析。这里选用PULL解析。

新闻数据:

news.xml

<?xml version="1.0" encoding="UTF-8" ?>
<newslist>
    <news>
        <title>安徽副省长罗马</title>
        <detail>今天下午,中纪委通报安徽省副省长杨振超落马,安徽是今年中央巡视组“回头看”的四省份之一</detail>
        <comment>15687</comment>
        <image>http://192.168.30.1:8089/images/6.jpg</image>
    </news>
    <news>
        <title>程序员因写代码太乱被杀害</title>
        <detail>凶手是死者同事,维护死者代码时完全看不懂而痛下杀手</detail>
        <comment>16359</comment>
        <image>http://192.168.30.1:8089/images/7.jpg</image>
    </news>
    <news>
        <title>产品经理因频繁改需求被杀害</title>
        <detail>凶手是一名程序员,因死者对项目需求频繁改动而痛下杀手</detail>
        <comment>14112</comment>
        <image>http://192.168.30.1:8089/images/7.jpg</image>
    </news>
    <news>
        <title>3Q大战宣判: 腾讯获赔500万</title>
        <detail>最高法驳回360上诉, 维持一审宣判.</detail>
        <comment>6427</comment>
        <image>http://192.168.30.1:8089/images/1.jpg</image>
    </news>
    <news>
        <title>今日之声:北大雕塑被戴口罩</title>
        <detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
        <comment>681</comment>
        <image>http://192.168.30.1:8089/images/2.jpg</image>
    </news>
    <news>
        <title>奥巴马见达赖是装蒜</title>
        <detail>外文局: 国际民众认可中国大国地位;法院: "流量清零"未侵权.</detail>
        <comment>1359</comment>
        <image>http://192.168.30.1:8089/images/3.jpg</image>
    </news>
    <news>
        <title>轻松一刻: 我要沉迷学习不自拔</title>
        <detail>放假时我醒了不代表我起床了, 如今我起床了不代表我醒了!</detail>
        <comment>11616</comment>
        <image>http://192.168.30.1:8089/images/4.jpg</image>
    </news>
    <news>
        <title>男女那些事儿</title>
        <detail>"妈, 我在东莞被抓, 要2万保释金, 快汇钱到xxx!"</detail>
        <comment>10339</comment>
        <image>http://192.168.30.1:8089/images/5.jpg</image>
    </news>
    <news>
        <title>帅哥语录一</title>
        <detail>少壮不努力,老大做IT</detail>
        <comment>14612</comment>
        <image>http://192.168.30.1:8089/images/8.jpg</image>
    </news>
    <news>
        <title>帅哥语录二</title>
        <detail>问君能有几多愁,恰似调完代码改需求</detail>
        <comment>13230</comment>
        <image>http://192.168.30.1:8089/images/8.jpg</image>
    </news>
    <news>
        <title>帅哥语录三</title>
        <detail>觉得我帅的人工资一般都比较高</detail>
        <comment>9928</comment>
        <image>http://192.168.30.1:8089/images/8.jpg</image>
    </news>
    <news>
        <title>今日之声:北大雕塑被戴口罩</title>
        <detail>市民: 因雾霾起诉环保局; 公务员谈"紧日子": 坚决不出去.</detail>
        <comment>681</comment>
        <image>http://192.168.30.1:8089/images/2.jpg</image>
    </news>

</newslist>

如果你下载下来进行测试的话,请记得将xml文件中的图片标签的ip地址改为自己本机的ip地址。

解析方法:

/**
     * 使用PULL解析
     * @param is 输入流
     */
    protected void parseNewsXml(InputStream is) {
        XmlPullParser xp = Xml.newPullParser();
        try {
            //解析输出流的位置
            xp.setInput(is, "utf-8");
            int eventType = xp.getEventType();
            while (eventType != XmlResourceParser.END_DOCUMENT) {
                switch (eventType) {
                case XmlResourceParser.START_DOCUMENT:
                    mNewsList = new ArrayList<News>();
                    break;
                case XmlResourceParser.START_TAG:
                    if ("news".equals(xp.getName())) {
                        news = new News();
                    }else if ("title".equals(xp.getName())) {
                        news.setTitle(xp.nextText());
                    }else if ("detail".equals(xp.getName())) {
                        news.setDetail(xp.nextText());
                    }else if ("comment".equals(xp.getName())) {
                        news.setComment(xp.nextText());
                    }else if ("image".equals(xp.getName())) {
                        news.setimageUrl(xp.nextText());
                    }
                    break;
                case XmlResourceParser.END_TAG:
                    if ("news".equals(xp.getName())) {
                        mNewsList.add(news);
                        news = null;
                    }
                    break;
                default:
                    break;
                }
                eventType = xp.next();
            }
            Message msg = Message.obtain();
            msg.what = SUCCESS;
            mHandler.sendMessage(msg);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

③使用万能适配器将新闻数据显示在ListView上。

④添加网络权限

<uses-permission android:name="android.permission.INTERNET" />
public class NewsAdapter extends CommonAdapter<News>{

    public NewsAdapter(Context context, List<News> data, int layoutId) {
        super(context, data, layoutId);
    }
    @Override
    public void current(ViewHolder holder, Object object) {
        News news = (News) object;
        ((TextView)holder.getView(R.id.tv_title)).setText(news.getTitle());
        ((TextView)holder.getView(R.id.tv_detail)).setText(news.getDetail());
        ((TextView)holder.getView(R.id.tv_comment)).setText(news.getComment() + "条评论");
        ((SmartImageView)holder.getView(R.id.siv)).setImageUrl(news.getimageUrl());
    }

}

大家如果看了我前面的文章,这个新闻客户端应该就很简单了,如果有不懂,请看我前面的万能适配器、PULL解析的文章,我这里就不多说了。

源码下载:http://download.csdn.net

时间: 2024-08-24 20:54:45

android开发笔记之网络编程—简易新闻客户端的相关文章

android开发笔记之网络编程—使用HTTP进行网络编程

上次我们讲到了使用URLConnection的网络编程,URLConnection已经可以非常方便地与指定站点交换信息,URLConnection下还有一个子类:HttpURLConnection. HttpURLConnection在URLConnection的基础上进行改进,增加了一些用于操作HTTP资源的便捷方法. setRequestMethod(String):设置发送请求的方法 getResponseCode():获取服务器的响应代码 getResponseMessage():获取服

android开发笔记之网络编程—使用TCP协议和URL进行网络编程

手机本身是作为手机终端使用的,因此它的计算能力,存储能力都是有限的.它的主要优势是携带方便,可以随时打开,而且手机通常总是处于联网状态.因此网络支持对于手机应用非常重要. Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建立基于UDP协议的网络通信. Android也支持JDK提供的URL,URLConnection等网络通信

Android开发笔记(一百一十六)网络学习资源

知名网站 本系列的开发笔记,对Android开发来说只是沧海一瓢,还有更多的技术等待我们去汲取.下面列出几个常用的开发网站,供初学者上路: 首先当然是国内首屈一指的技术网站csdn啦,csdn提供了众多频道,包括博客.论坛.下载.问答等等,其中博客专栏提供了最新的技术文章,值得推荐.csdn博客专栏的地址是 http://blog.csdn.net/column.html 下面是csdn博客专栏的网页截图: 其次是国外有名的开源网站GitHub,这里有众多的开源项目源码,是开发者分享代码的乐园.

Android开发笔记(一百一十一)聊天室中的Socket通信

Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信.计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑上设置本地连接的ip时,便经常看到下图的弹窗,注意红框部分已经很好地描述了TCP/IP协议的作用. TCP/IP是个协议组,它分为三个层次:网络层.传输层和应用层: 网络层包括:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 传输层包括:TCP协议.UDP协议. 应用层包括:HT

[置顶] Android开发笔记(成长轨迹)

分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API 调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了. 2.

《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型

1.前言 移动端的数据来源非常重要,它决定了移动端功能的实现.早期的ArcGIS Android API中,主要以接入在线的数据源为主,因此主要实现在线的地图浏览.查询和路径分析.地理处理等从操作:在v1.0.1版本中,ArcGIS移动产品第一次可以加载松散型切片,自此逐渐掀开了对本地离线数据源的支持,也因此可以在移动端实现越来越受欢迎的离线功能.现在最新的10.2.7 API离线支持数据主要包括紧凑型切片.tpk切片包..geodatabase..shp文件.地名地址库.网络数据集. 转载请注

Android开发笔记(一百零九)利用网盘实现云存储

网盘存储 个人开发者往往没有自己的后台服务器,但同时又想获取app的运行信息,这就要借助于第三方的网络存储(也叫网盘.云盘.微盘等等).通过让app自动在网盘上存取文件,可以间接实现后台服务器的存储功能,同时开发者也能及时找到app的用户信息. 曾几何时,各大公司纷纷推出免费的个人网盘服务,还开放了文件管理api给开发者调用,一时间涌现了网盘提供商的八大金刚:百度网盘.阿里云.华为网盘.腾讯微云.新浪微盘.360云盘.金山快盘.115网盘.可是好景不长,出于盈利.监管等等因素,各大网盘开放平台要

Android开发笔记(一百零八)智能语音

智能语音技术 如今越来越多的app用到了语音播报功能,例如地图导航.天气预报.文字阅读.口语训练等等.语音技术主要分两块,一块是语音转文字,即语音识别:另一块是文字转语音,即语音合成. 对中文来说,和语音播报相关的一个技术是汉字转拼音,想想看,拼音本身就是音节拼读的标记,每个音节对应一段音频,那么一句的拼音便能用一连串的音频流合成而来.汉字转拼音的说明参见<Android开发笔记(八十三)多语言支持>. 语音合成通常也简称为TTS,即TextToSpeech(从文本到语言).语音合成技术把文字

Android开发笔记(一百零七)统计分析SDK

APP统计分析 用户画像 对程序员来说,用户画像就是用户的属性和行为:通俗地说,用户画像是包括了个人信息.兴趣爱好.日常行为等血肉丰满的客户实体.用户画像是精准营销的产物,企业通过收集用户的行为,然后分析出用户的特征与偏好,进而挖掘潜在的商业价值,实现企业效益的最大化. 用户画像的一个具体应用是电商app的"猜你喜欢"栏目,电商平台通过对用户购买过的商品进行统计,可以分析用户日常生活用的是什么物品:电商平台还可以对用户的搜索行为.浏览行为进行统计,从中分析用户感兴趣的商品,或者说考虑购