文档章节

模拟网易新闻

Eviltuzki
 Eviltuzki
发布于 2014/10/05 00:39
字数 1321
阅读 41
收藏 0
点赞 0
评论 0

模拟网易新闻


根据黑马Android28期视频做的东西,小程序涉及到了BaseAdapter,HttpClient,XmlPullParser,Handler

第一次写博客这玩意。。。还真不知道入手点。。

黑马28期视频也看了6天的了(耗时2周了吧。。),总算完成了一个相对而言有点价值的玩意。。。。

这个模拟网易新闻的玩意,主界面用的ListView,每个新闻信息,使用RelativeLayout布局,无非就是几张图片,几个文本,给出的样本XML文件解析起来方便的多,因为是人为优化过的。。。(后来自己从网易新闻找到XML解析。。。)

开始整理一个新闻类(包括标题啊,描述啊,图片啊。。之类的(模拟最恶心的就是那个跟帖= =!))

首先从XML文件得到输入流is

public List<NewsInfo> getNewsFromInternet() {
        HttpClient client = null;
        try {
            client = new DefaultHttpClient();
            HttpGet get = new HttpGet(
                    "http://192.168.1.102:8080/NetEaseServer/new.xml");//解析地址
            HttpResponse response = client.execute(get);
            int statusCode = response.getStatusLine().getStatusCode();//返回状态码,200就是成功
            if (statusCode == 200) {
                InputStream is = response.getEntity().getContent();//通过这玩意得到流,然后就可以得到文本(新闻)
                List<NewsInfo> newsinfo = getNewsFromInputStream(is);
                return newsinfo;
            } else {
                Log.i(TAG, "访问失败: " + statusCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (client != null) {
                client.getConnectionManager().shutdown();//关闭HttpClient
            }
        }
        return null;
    }

然后从流解析出文本

public List<NewsInfo> getNewsFromInputStream(InputStream is)
            throws Exception {
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(is, "utf-8");//不想出乱码,就得改编码。。
        int eventTypy = parser.getEventType();//解析标签的类型,0是START_DOCUMENT,1是END_DOCUMENT ,2是 START_TAG ,3是END_TAG 
        List<NewsInfo> newInfoList = null;
        NewsInfo info = null;
        while (eventTypy != XmlPullParser.END_DOCUMENT) {
            String tagName = parser.getName();// 总要获得一下节点名称,毕竟StartTag是<>,EndTag是</>
            switch (eventTypy) {
            case XmlPullParser.START_TAG:
                if ("news".equals(tagName)) {//匹配最大的节点,创建集合
                    newInfoList = new ArrayList<NewsInfo>();
                } else if ("new".equals(tagName)) {//匹配每条节点,创建新闻,后面就是内容了
                    info = new NewsInfo();
                } else if ("title".equals(tagName)) {
                    info.setTitle(parser.nextText());
                } else if ("detail".equals(tagName)) {
                    info.setDetail(parser.nextText());
                } else if ("comment".equals(tagName)) {//最2B的跟帖评论量。。。。
                    info.setComment(parser.nextText());
                } else if ("image".equals(tagName)) {
                    info.setImage(parser.nextText());
                }
                break;
            case XmlPullParser.END_TAG:
                if ("new".equals(tagName)) {
                    newInfoList.add(info);
                }
                break;
            }
            eventTypy = parser.next();
        }
        return newInfoList;
    }

初始化方法开启线程,由于子线程无法直接改写View,所以通过Message向Handler对象传送数据

public void init() {
        listview = (ListView) findViewById(R.id.lv_list);
        new Thread(new Runnable() {//第一次用这种方式开启线程
            @Override
            public void run() {
                List<NewsInfo> listInfo = getNewsFromInternet();//获得集合
                Message msg = new Message();//创建消息对象
                if (listInfo != null) {
                    msg.what = 1;//好吧,我犯懒了,这个是成功的标志位(按理说应该弄个SUCCESS常量的。。。)
                    msg.obj = listInfo;//成功发送新闻集合
                } else {
                    msg.what = 0;//失败标志位
                }
                handler.sendMessage(msg);//我开始就是这里犯二了。。。竟然没发送消息- -怪不得模拟器上面是空孔的。。。
            }
        }).start();//线程开启,没啥说的
    }

关于Handler对象

private Handler handler = new Handler() {
        @Override
        public void handleMessage(android.os.Message msg) {//重写接收消息的方法
            switch (msg.what) {//根据标志位判断操作
            case 1:
                newsInfoList=(List<NewsInfo>) msg.obj;//对象强转一下就可以了。。
                MyAdapter adapter = new MyAdapter();//后面的内部类,每条消息的内容设置。。。
                listview.setAdapter(adapter);//这个- -我开始又忘了加了。。不设置Adapter,列表怎么会显示嘛= =~~~~
                break;
            case 0:
                Toast.makeText(MainActivity.this, "当前网络崩溃了.", 0).show();//失败消息
                break;
            }
        }
    };

内部类MyAdapter

class MyAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return newsInfoList.size();//返回一共有多少条信息
        }
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view =null;
            if(convertView!=null){
                view =convertView;//这玩意貌似是缓存对象吧,具体咋回事我也不太明白。。还得在研究一下
            }else{
                LayoutInflater inflater =getLayoutInflater();    //着两行就完全不明白了= =啥东西。。。按照教程写的。。。
                view=inflater.inflate(R.layout.list_item, null);
            }
            SmartImageView siv_icon = (SmartImageView) view.findViewById(R.id.siv_icon);//忘了说了。。这个是从Github上面找的一个Android开源框架的玩意。。。就是设置图片的。。。还挺好用的。。
            TextView tv_comment = (TextView) view.findViewById(R.id.tv_comment);
            TextView tv_detail = (TextView) view.findViewById(R.id.tv_detail);
            TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
            
            NewsInfo news =newsInfoList.get(position);
            siv_icon.setImageUrl(news.getImage());//这个简单了。。直接给地址就能出图片- -省了好多麻烦。。。
            tv_detail.setText(news.getDetail());
            tv_comment.setText(news.getComment()+"跟帖");
            tv_title.setText(news.getTitle());
            return view;//中间这里一直返回null。。。。害我查了半天= =下次这种错误不能犯!!!
        }
    }

基本核心内容就是上面这些,但是这些只能解析- -他给的文档。。。。

好吧,接下来自己动手稍微改了一下。。。。

public List<NewsInfo> getNewsFromInputStream(InputStream is)
            throws Exception {
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(is, "utf-8");
        int eventTypy = parser.getEventType();
        
        List<NewsInfo> newInfoList = null;
        NewsInfo info = null;
        while (eventTypy != XmlPullParser.END_DOCUMENT) {
            Log.i(TAG, eventTypy+"");
            String tagName = parser.getName();// 节点名称
            switch (eventTypy) {
            case XmlPullParser.START_TAG:
                if ("channel".equals(tagName)) {
                    newInfoList = new ArrayList<NewsInfo>();
                } else if ("item".equals(tagName)) {
                    info = new NewsInfo();
                } else if ("title".equals(tagName)&&info!=null) {/*对于网易新闻。。。。比较坑的是。。。他会加<title>网易新闻</title>这个标签。。。
                                                                  还不是在<item></item>之间,开始运行不通过,就是因为这里info还是null,所以直接空指针异常了*/
                    info.setTitle(parser.nextText());
                } else if ("description".equals(tagName)&&info!=null) {
                    String str=parser.nextText();
                    info.setDetail(str.substring(0, str.indexOf("......")));//这里是实属无奈= =里面竟然出现了HTML代码。。。我只好先把HTML部分截掉了。。。。。。。。。。。。
                } 
                break;
            case XmlPullParser.END_TAG:
                if ("item".equals(tagName)) {
                    newInfoList.add(info);
                }
                break;
                default:
                    break;
            }
            eventTypy = parser.next();
        }
        return newInfoList;
    }

-0-这玩意就能接收网易新闻XML文件了。。。

不过还有一点比较蛋疼。。。这个描述里面还有HTML的玩意。。这个玩意咋处理呢。。。(我这里直接截掉了- -~~)

© 著作权归作者所有

共有 人打赏支持
Eviltuzki
粉丝 5
博文 31
码字总数 11990
作品 0
朝阳
程序员
为什么网易新闻客户端的下拉刷新让我感到很舒服

用过网易新闻客户端,新浪新闻,凤凰新闻,澎湃新闻等几个新闻类app,其中个人赶脚网易新闻客户端的下拉体验是最好的,原因:栏目之间切换自动加载新闻时,模拟了下拉刷新的操作,而且在加载...

inferrrrrr ⋅ 2015/12/15 ⋅ 0

手机app的爬取 应该是个 什么思路?

比如 我要抓 网易新闻 客户端 上的的数据 我们在pc上直接用浏览器打开一个网址,它是有地址的,无论页面是 用 js 填充的 还是 用 类似jsp的 EL 表达式的方式 写入的,自己都可以 用 程序(如...

Inszt ⋅ 2015/06/27 ⋅ 6

网易将向苹果商店投诉腾讯抄袭

网易方面昨日透露,将以“抄袭网易新闻客户端”的理由向苹果应用商店投诉腾讯新闻客户端。网易上周四发表公开声明,“强烈谴责”腾讯公司腾讯新闻iPhone客户端的2.0版本抄袭其旗下重要的移动...

红薯 ⋅ 2012/04/16 ⋅ 45

从网易首页变化看互联网15年变化

网站首页的变化不仅是一家互联网企业的“门面”,对“历史悠久”的网站来说,更能反映出互联网的变化,网易就是其中之一。本文将从网易首页15年来的变化,回顾15年来中国互联网发展历程。 19...

oschina ⋅ 2012/05/23 ⋅ 65

[图] 腾讯VS网易:邮箱“隔空掐架”

继不久前网易指责腾讯抄袭其新闻客户端之后,近日,网易邮箱与腾讯邮箱又开始“隔空掐架”,引发了大量网友的围观和热议。4 月12日,网易公司宣布,旗下重要的移动互联网产品网易新闻客户端,...

虫虫 ⋅ 2012/04/25 ⋅ 25

新版网易新闻客户端应用iOS源码

这是一个不错的iOS项目源码。 源码下载: http://code.662p.com/view/11510.html 演示图: 1.这次更新的亮点是添加了天气效果以后也可以用网易新闻看天气预报了,各种轻微的动画效果也没有放...

tianyahala ⋅ 2015/10/13 ⋅ 1

新版网易新闻客户端应用源码

源码下载: http://code.662p.com/view/11510.html 演示图: 1.这次更新的亮点是添加了天气效果以后也可以用网易新闻看天气预报了,各种轻微的动画效果也没有放过。 2.新版的网易新闻,整改了...

tianyahala ⋅ 2015/10/16 ⋅ 0

如何优雅地动态插入数据到UITableView

任他风吹雨打,我自岿然不动! 当我们实时往中插入数据并刷新列表的时候,会发现列表是有抖动的。比如在微信聊天页面,你滑动到某一个位置保持住,然后收到一个或者若干人的微信(这几个人不在...

foolishBoy ⋅ 2017/06/07 ⋅ 0

要收费了?网易公开课宣布进军教育付费领域

  【IT168 资讯】4月26日,网易新闻在GMIC大会上宣布了2018战略,包含“网易公开课将进军教育付费领域”、“网易号将大力扶植中腰部账号”等重点业务方向。   据国内知名移动大数据服务商...

it168网站 ⋅ 04/27 ⋅ 0

关于一个Android新闻通知客户端的问题

最近想做一个在Android手机的新闻通知客户端,我的想法是:在后台,以管理员的身份增删改新闻通知信息,这一块我想用JSP做,并把数据保存到Mysql数据库中,然后可以在android手机上通过客户端...

Jerikc ⋅ 2012/06/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部