分分钟教你做出自己的新闻阅读APP

引子

  曾经不小心发现了一些好的看新闻的网站,但是电脑又不是随身携带,因此想要下载一个这个网站的手机APP来看新闻,但是问题来了,这个网站根本没有做Android端!你说用手机浏览器来看?天,有些网站用手机浏览器来看又会出现好些个问题,比如说:广告太多,还有那令人厌恶的弹窗,更有些排版简直让人不忍直视有木有。因此,我萌生出一个自己打造一个新闻阅读器的APP的想法,毕竟以前也玩过Android的开发,虽然是菜鸟级别的,但是做出一个手机新闻阅读APP还是难不倒我的~

  工欲善其事,必先利其器

  开发工具:安装过Android插件的Eclipse。

  必备jar包:jsoup-1.7.2.jar,(当然,其它版本也可以)

  必备知识:一点Android知识,一点HTML知识

技术原理

  技术上来讲毫无难点。具体实现步骤如下:

  • 连接新闻网站的首页
  • 抓取HTML的内容
  • 解析抓取的HTML网页中的标题以及文章链接
  • 将所有标题显示在当前页,并将标题以及文章链接传到下一个页面
  • 抓取文章链接内容,和上页传来的标题一起显示在当前页

 看的再多不如动手一试 

  由于快点看出效果,所以一切就从简了。直接建立Android项目,建立空的Activity。然后在你的layout的 这个文件中加入一个按钮。比如像这样:

<Button
android:id="@+id/button1"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignLeft="@+id/button2"
android:background="@drawable/button"
android:text="Business Insider" />

  然后在MainActivity里的onCreateView函数里加入一个方法,让它能点击你刚刚添加的按钮进入到下一个界面: 

 rootView.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {

                 @Override
public void onClick(View v) {
// TODO Auto-generated method stub
StartGeek();
} });

  点击按钮会触发事件,执行StartGeek的方法,而StartGeek的方法则是跳到下一个Activity,  

 private void StartGeek() {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(this.getActivity(), GeekActivity.class);
startActivity(intent); }

StartGeek

  在这个Activity中,我们将访问网页,并从中获取HTML网页的内容,然后进行解析,获取新闻的标题以及链接,然后将新闻的标题显示在手机屏幕上,代码具体实现如下:

     ListView listview;
Handler handler;
List<Map<String, Object>> data; final String CSDNURL = "http://tech.qq.com/bi.htm";  

  首先是变量的声明,至于变量名的问题请随意吐槽,因为一直在尝试拿各种网站的新闻内容,所以变量名是最初的,由于懒就一直没换-。 -,由于新闻网站的内容较多,所以用ListView比较合适,这样不会出现显示不全的情况。

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_geek);
handler = getHandler();
ThreadStart();
} 
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${packageName}.${activityClass}" > <ListView
android:id="@+id/listView"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
></ListView> </RelativeLayout>

activity_geek.xml

  接下来是onCreate方法,这里界面是activity_geek,然后调用两个方法,由于获取数据费时,所以又起了一个线程,当然比较好的方法是用异步线程来做,那样的话不仅可以不占用主线程,而且还可以很方便的加进度条什么的,相当好用,至于我为什么不用,当然是不会用了撒~ 

 private void ThreadStart() {
new Thread() {
public void run() {
Message msg = new Message();
try {
data = getCsdnNetDate();
msg.what = data.size();
} catch (Exception e) {
e.printStackTrace();
msg.what = -1;
}
handler.sendMessage(msg);
}
}.start();
}

ThreadStart

  这是新的线程,用于从网址获取我们想要的HTML文件,并将其传给handler处理。获取的函数方法是:

 data = getCsdnNetDate();
 private List<Map<String, Object>> getCsdnNetDate() {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
Document doc = http_get(CSDNURL);
Elements links = doc.select("h3>a");
for(Element link: links)
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", link.attr("title"));
map.put("url", link.attr("abs:href"));
result.add(map);
} return result;
}

getCsdnNetDate 

 Document doc = http_get(CSDNURL);
 private Document http_get(String url) {
Document doc=null;
try {
doc = Jsoup.connect(url)
.timeout(50000)
.get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return doc;
}

http_get

  通过http_get方法中的Jsoup.connect来连接到网址,然后通过.get方法来获得HTML的文本信息,设定的连接时间是5S,获取到这个文本信息之后Jsoup还带有解析方法,通过link.attr("title")来获取HTML中的<title>标签中的标题,然后再通过link.attr("abs:href")来获取新闻中的链

接,由此,我们就获得了HTML中最为重要的两部分,也就是标题以及链接,事情到这里已经完成大半了,接下来就是将标题显示在当前页面,然后点击标题后,能将标题以及文中内容显示在下个页面,处理的方法如下:

 private Handler getHandler() {
return new Handler(){
public void handleMessage(Message msg) {
if (msg.what < 0) {
Toast.makeText(GeekActivity.this, "数据获取失败", Toast.LENGTH_SHORT).show();
}else {
initListview();
}
}
};
}

getHandler

  此方法会判断数据是否为空,若为空则在手机屏幕跳出:数据获取失败的字样,当然了,喜欢什么就改成什么,随你所想~然后成功获取数据则会进入到initListview方法:  

 private void initListview() {
listview = (ListView)findViewById(R.id.listView);
SimpleAdapter adapter = new SimpleAdapter(this, data,
android.R.layout.simple_list_item_1, new String[] { "title"},
new int[] { android.R.id.text1 });
listview.setAdapter(adapter); listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Map<String, Object> map = data.get(arg2);
String url = (String)(map.get("url"));
String title = (String)(map.get("title"));
Intent intent = new Intent();
intent.putExtra("url", url);
intent.putExtra("title", title);
intent.setClass(GeekActivity.this, ContentActivity.class);
startActivity(intent);
}
});
}

initListview

  这个方法会将获取的新闻标题显示在当前页面上,然后将新闻的标题以及链接保存下来,通过intent传到下一个Activity,也就是ContentActivity进行处理,并将标题以及内容显示在下一个页面中。代码的分下如下:

 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content); url = getIntent().getStringExtra("url");
String title = getIntent().getStringExtra("title");
TextView tv = (TextView)findViewById(R.id.title_content);
tv.setText(title);
handler = getHandler();
ThreadStart();
}

onCreate

  onCreate方法中获取上个Activity中传过来的url以及title,然后直接将新闻标题显示在当前页,然后剩余部分和上个方法差不太多,连接到网上,获取HTML内容,这次在方法中仅仅是解析的方法不同,毕竟这次解析是要获取内容嘛~代码如下:

 private List<Map<String, Object>> getCsdnNetDate() {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
Document doc = http_get(url);
Elements links = doc.select("div#Cnt-Main-Article-QQ>p");
for(Element link: links)
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", link.text());
result.add(map);
} return result;
}

  标红部分为与上次不同的部分,这个解析都是用的Jsoup自带的,当然正则表达式也是可以做到的哦,咳咳,我承认我很懒的啊,有好用的工具就直接用了,省时省力的事干嘛不用呢,就像写网站有框架了自然就用了,不喜欢用的我也木有办法,你可以使用正则表达式来做,话说以前用

Python做爬虫的时候就是正则表达式做的。

  至此一个小的新闻的阅读APP就出世了,哦,对了,不要忘了在你的配置文件加入Activity以及上网许可,不然的话是会闪退的哦。当然这个APP很是粗糙,有时间的人可以将图片也加上进行一下页面的设计,做一下美工什么的。

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  <。)#)))≦

分分钟教你做出自己的新闻阅读APP的更多相关文章

  1. 移动跨平台开发框架Ionic开发一个新闻阅读APP

    移动跨平台开发框架Ionic开发一个新闻阅读APP 前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. ...

  2. [ionic开源项目教程] - 手把手教你使用移动跨平台开发框架Ionic开发一个新闻阅读APP

    前言 这是一个系列文章,从环境搭建开始讲解,包括网络数据请求,将持续更新到项目完结.实战开发中遇到的各种问题的解决方案,也都将毫无保留的分享给大家. 关注订阅号:TongeBlog ,查看移动端跨平台 ...

  3. daily news新闻阅读客户端应用源码(兼容iPhone和iPad)

    daily news新闻阅读客户端应用源码(兼容iPhone和iPad),也是一款兼容性较好的应用,可以支iphone和ipad的阅读阅读器源码,设计风格和排列效果很不错,现在做新闻资讯客户端的朋友可 ...

  4. (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...

  5. jQuery Mobile发展新闻阅读器,适应iphone和android打电话

    程序猿是很不赖,你知道. 我们经常新浪,腾讯.雅虎等各大网站看到上述新闻.他们还推出了自己的移动新闻阅读器.今天,我自己用的jQuery Mobile 为了实现这一功能,.图像大小上传限制的大小250 ...

  6. (android高仿系列)今日头条 --新闻阅读器 (二)

    高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一)    上次,已经完毕了头部新闻分类栏目的拖动效果. 这篇文章是继续去完好APP 今日头条  这个新闻阅读器的其 ...

  7. 微信小程序编写新闻阅读列表

    微信小程序编写新闻阅读列表 不忘初心,方得始终:初心易得,始终难守. 本篇学习主要内容 Swiper 组件(轮播图) App.json 里的关于导航栏.标题的配置. Page 页面与应用程序的生命周期 ...

  8. jQuery Mobile开发的新闻阅读器,适应iphone和android手机

    程序猿都非常赖.你懂的! 我们常常上新浪,腾讯.雅虎等各大站点上面看新闻.他们也都各自推出了自家的手机新闻阅读器.今天我自己使用jQuery Mobile 来实现这一功能.图片大小上传限制了大小250 ...

  9. Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)

    这一系列博文都是:(android高仿系列)今日头条 --新闻阅读器 (一) 开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉 ...

随机推荐

  1. 在数据绑定控件(如:Repeater)中使用if判断

    方法: target="<%# DataBinder.Eval(Container.DataItem, "数据库字段").ToString() == "t ...

  2. centos下的安装mysql,jdk

    mysql: 如果你是用rpm安装, 检查一下RPM PACKAGE:rpm -qa | grep -i mysql如果mysql已经安装在本机,则会列出mysql安装过的文件 ,像mysql-ser ...

  3. UVA Mega Man's Mission(状压dp)

    把消灭了那些机器人作为状态S,预处理出状态S下可以消灭的机器人,转移统计方案.方案数最多16!,要用64bit保存方案. #include<bits/stdc++.h> using nam ...

  4. axios跨域问题记录

    axios({headers: {'X-Requested-With': 'XMLHttpRequest','Content-Type': 'application/json; charset=UTF ...

  5. C语言字符,字符串,字节操作常用函数

    strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef ...

  6. windows环境下安装npm、cnpm、bower

    什么是npm.cnpm.bower? 简单地说,就是帮你下载好你需要的css或者js库,而且三者功能也都是一样的.那为什么要下载这3个不同的呢?据说npm容易被墙……而cnpm是淘宝的镜像,所以通常用 ...

  7. Zookeeper协调服务系统·ELK日志管理系统简介

    Zookeeper协调服务系统: 说明:它分布式系统中的协调服务系统,是Hadoop下的一个子项目,可提供的服务有:名字服务.配置服务.分布式同步.组服务等. 3个角色:Leaders.Follow. ...

  8. mongodb安装,库操作,集合操作(表),文档操作(记录)

    安装 1.下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.8-signed.msi 2.如果报没 ...

  9. V4L2学习(五)VIVI虚拟摄像头驱动

    概述 前面简单分析了内核中虚拟摄像头驱动 vivi 的框架与实现,本文参考 vivi 来写一个虚拟摄像头驱动,查询.设置视频格式相对简单,难点在于 vb2_buf 的处理过程. 数据采集流程分析 在我 ...

  10. (洛谷)P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...