黑马程序员技术交流社区

标题: 【阳哥专栏】黑马Android教程-Android基础05网络编程&消息处... [打印本页]

作者: 王震阳老师    时间: 2015-3-10 08:51
标题: 【阳哥专栏】黑马Android教程-Android基础05网络编程&消息处...
本帖最后由 王震阳老师 于 2015-3-23 22:21 编辑

Android基础-05网络&消息机制&开源框架


黑马程序员上海校区招生火爆开启!阳哥约你在上海!







pdf附件回复可见:

1. Android网络编程(★★★
在当今互联网时代,我们在公司写的Android程序基本不可能不联网的,网络编程是任何一个Android程序员必备的技能。
1.1网络编程的预备知识
访问网络的Android应用都必须加上访问互联网的权限:
开启子线程执行网络或者耗时的操作
:在Android中凡是对UI的更新、“耗时”操作等都需要在子线程中进行。
★ 1.Android4.0以上版本,Google更加在意UI界面运行的流畅性,强制要
求访问网络的操作不允许在主线程中执行,只能在子线程中进行,在主线程请求网络时,会报如下错误:
★ 2.ANR异常:Application Not Response,应用程序无响应。在主线程中做一些耗时的操作,阻塞了主线程,当用户点击其时,主线程无法响应,这是就会出ANR异常。
子线程不能修改UI
主线程也叫UI线程,Activity中的onCreate方法和点击事件的方法都是运行在主线程中的。主线程创建的界面,只有主线程才能修改,别的线程不允许修改UI,否则会报如下错误:
如果子线程修改了UI,系统会验证当前线程是不是主线程,如果不是主线程,就会终止运行。
:既然子线程不能修改主线程的UI那么,我们的子线程如果需要修改UI该怎么办呢?
解决方式:使用Handler实现子线程与主线程之间的通信。
消息处理机制原理:所有使用UI界面的操作系统,后台都运行着一个死循环(Looper),在不停的监听和接收用户发出的指令,一旦接收指令就立即执行。关于Handler的使用会在接下来的案例中介绍,这里先点到为止。
模拟器如何访问本地Tomcat
模拟器把它自己作为了localhost,也就是说,代码中使用localhost或者127.0.0.1来访问,都是访问模拟器自己!若想在模拟器上面访问我们的电脑,那么就使用android内置的IP: 10.0.0.2,10.0.0.2是模拟器设定的特定ip,在模拟器上用 10.0.0.2就能成功访问我们的电脑本机。
1.2案例-网络图片查看器
需求:实现一个网络图片查看器,在页面输入框填入网络图片的地址,点击访问按钮,可以访问网络并获取图片,并显示在界面上。
新创建一个工程,工程名字《网络图片查看器》。
在工程清单文件(AndroidManifest.xml)中添加访问网络权限
使用并修改默认的布局文件(activity_main.xml)。
使用并编辑默认的Activity(MainActivity.java)


运行上面的工程,效果图如下:输入百度图片的一个网址

1.3案例-网页源码查看器
需求:实现一个网页源码查看器,在页面输入框填入网页的地址,点击访问按钮,可以读取网页并显示在界面上。
:该案例跟1.2章节案例类似,因此可以直接在1.2章节中创建的工程中修改,当然新建工程也可以。使用Button按钮、EditText控件、TextView控件设置布局,在网络访问时,将接收到的二进制流转换成字符串,将字符串交由handler修改TextView的显示即可。
因为布局比较简单,处于节约篇幅的考虑就不再给出布局清单,这里只给出Activity类代码清单。MainActivity.java代码清单如下:
运行以上程序,结果图如下:
1.4案例-新闻客户端
需求:使用ListView控件实现一个新闻客户端,新闻信息以XML文件的格式存储,通过网络访问存放新闻信息的XML文件,解析此文件,逐条信息生成ListView的item,添加到ListView中,在界面上呈现出来。
创建一个新工程,工程名为《新闻客户端》,包名为com.itheima.news,在清单文件中添加访问网络权限。
使用并编辑默认布局文件activity_main.xml,布局文件清单如下:
在res/layout目录下创建item.xml文件,作为第二步骤中ListView的item布局文件。该布局文件采用相对布局,布局清单如下:
:在上面的布局文件中我们采用了开源框架SmartImageView控件来显示图片。在布局文件声明此控件时需写全包路径,否则将无法找到。关于SmartImageView的用法将会在下面的撞见中详细介绍。该框架很小巧,只需将如下文件添加到工程中。
编写一个JavaBean用于封装新闻对象。类名:News
在本地tomcat的webapps目录下创建news文件夹,然后将news.xml和image文件添加到改文件夹中。查看本机的IP地址,并修改news.xml文件。然后启动tomcat。部署后的tomcat目录结构如下截图。
其中news.xml的文件清单如下:
使用并编辑默认MainActivity.java,在该类中实现所有方法。
运行上面的程序,效果图如下:



1.5案例-向服务器提交数据
该案例模拟Android客户端给服务器端发送登录申请,客户端将用户名和密码发给服务器,由服务器来验证登录是否成功。在该案例中我们分别用GET和POST两种方式提交数据。
在该案例前我们需要做一些前期工作,首先在本地tomcat服务器上发布一个用户登录的服务。服务端用JavaWEB阶段学过的Servlet实现。这里直接给出Servlet代码,关于JavaWEB的其他知识这里不再涉及。
以GET方式向客户端提交数据
LoginServlet核心业务代码清单如下:
将该Servlet发布到本地tomcat,然后运行tomcat,首先通过浏览器测试服务,发现发布成功。
新创建一个Android工程,工程名《用户登录》。使用默认的布局文件和Activity。
布局文件清单如下:
MainActivity 代码清单文件如下:
运行上面的工程,输入账号heima,密码123456,发现登录成功。
运行截图如下:
以POST方式向客户端提交数据
该方式跟以POST方式提交数据只有稍微的区别,因此为了方便演示,我们直接在上面的工程中修改代码。
在上面的代码清单中,蓝色部分为老的内容,需要替换,黄色的部分是新添加的部分。
运行上面的代码会得到跟以GET方式提交同样的结果。
:在上面的2个案例中,如果我们如果提交的用户名是中文,我们可能会遇到乱码问题,因此下面将结合上面的案例介绍一下常见的中文乱码问题。
1.6中文乱码问题
Android操作系统默认使用的编码是UTF-8,解决中文乱码问题的关键是确保服务器和客户端使用的编码一致。
1.6.1 GET方式中文乱码的解决
客户端:在拼接字符串的时候,对传递的数据通过URLEncoder类进行一下编码,使用的编码方式与服务器约定的编码方式一致。这里假设服务端的编码方式为UTF-8,发送数据到服务器的处理代码如下:
接收来自服务器的数据时,处理代码如下:

服务端:Tomcat默认采用iso-8859-1的编码接收客户端传递来的数据,因此在获取request请求中传递来的参数时,需先用iso-8859-1对参数进行解码,然后再以客户端传递的数据的编码方式进行编码。这里假设客户端发送的数据其编码方式为UTF-8,获取请求参数时处理代码如下:
发送数据给客户端时,处理代码如下:

1.6.2 POST方式中文乱码的解决
客户端:发送数据给服务器的时候,对发送的数据进行编码。
接收数据时的处理逻辑与GET方式相同。
服务端:发送数据给客户端时的处理逻辑与GET方式相同,接收request请求发送来的参数时,可以采用先使用iso-8859-1解码再使用客户端的编码方式进行编码,也可以通过如下处理代码实现:
2. Android消息处理机制(★★★★2.1 LooperMessageHandler的关系[/url]
当我们的Android应用程序的进程一创建的时候,系统就给这个进程提供了一个Looper,Looper是一个死循环,它内部维护这个一个消息队列。Looper不停地从消息队列中取消息(Message),取到消息就发送给了Handler,最后Handler根据接收到的消息去修改UI。Handler的sendMessage方法就是将消息添加到消息队列中。
2.2 runOnUiThread
Activity中提供了一个runOnUiThread方法,用于进行消息处理。此方法是通过线程合并——join来实现消息处理的。
线程合并:主线程将子线程的任务拿到自己这里来执行并终止子线程。
实例代码如下:
2.3 postDelayed
该方法是Handler对象提供的,Handler给消息队列发送一个消息,发送成功则返回true,否则返回false,如果返回false一般是由于looper进程不存在导致的。该方法主要用于定时任务。如果返回true也不一定代表着我们的定时任务就执行了,因为很可能在定时任务的时间未到之前我们的looper进程退出了,那么消息也就丢失了。
执行该任务的线程用的就是Handler对象所在的线程。
2.4 postAtTime
该方法也属于Handler对象,唯一不同的是该方法设置的定时任务是一个绝对时间,指的是Android系统的开机时间,如果想设置从当前时间算起2秒后执行该任务则可以将时间这样写:SystemClock.uptimeMillis()+2000,其中SystemClock.uptimeMillis()是系统运行时间。

3. 网络编程中常用的框架(★★★3.1开源框架SmartImageView
此框架提供很多实用的功能,其中可使用setImageUrl方法将一个网络图片的地址赋值给此控件,此控件内部的处理逻辑将访问网络获取指定URL的图片资源,并显示到客户端。该框架的使用很简单。
★使用步骤:
3.2 HttpClient
HttpClient是apache开源组织研发的一个API,被Android引入使用。(URL以及HttpUrlConnection是java自带的API)。        HttpClient设计的思想是模拟浏览器的操作来实现网络访问。
使用步骤:
InputStream is=response.getEntity().getContent()
client.getConnectionManager().shutdown()
3.2.1 使用HttpClient发送GET请求
为了方便演示,我们直接使用本文档1.5章节的工程,只需修改发送用户数据的核心方法即可。
代码清单如下:

3.2.2 使用HttpClient发送POST
使用上节中的工程,只需修改核心功能代码即可。代码清单如下:

3.3开源框架AsyncHttpClient
AsyncHttpClient是一个Android的异步HTTP函数库,使用此开源项目访问网络时,无需开启子线程,因为调用其方法时传递的接口参数中的方法就是执行在主线程中的,使用起来非常方便。登录github,搜索async-http,下载此开源项目,添加jar包到工程下的lib目录,直接使用即可。百度云盘下载地址:[color=rgb(87, 137, 220) !important]http://pan.baidu.com/s/1qWz80Ew
为了演示AsyncHttpClient的使用,我们依然使用上一个章节的《用户登陆》工程,只需将下载的jar包添加到工程中,如图所示。
3.3.1使用GET方式提交数据给服务器[/url]
这里只在原有工程的基础上修改核心代码,代码清单如下:
3.3.2使用POST方式提交数据给服务器
基本逻辑与GET方式相同,不同的是GET方式调用的是GET方法,POST方式调用的是POST方法;GET方式将请求参数拼接在URL后面传输给服务器,POST方式需要使用RequestParams对象封装请求参数给post。
3.3.3上传文件到服务器[/url]
上传文件其实用的就是POST方法,只需要给RequestParams对象设置一个File类型的参数即可。实例代码如下:

至此,本文档完!





作者: 埗箬    时间: 2015-3-10 09:34
沙发~虽然这回的有点难,但是还是跟着比较好
作者: 王震阳老师    时间: 2015-3-10 10:57
埗箬 发表于 2015-3-10 09:34
沙发~虽然这回的有点难,但是还是跟着比较好

你是在看着学吗?
作者: mark.tian    时间: 2015-3-10 21:17
大神,。。。。。哈哈,希望有天能达到你的水平
作者: 默桑    时间: 2015-3-10 21:49
很好,学习了,很不错的帖子
作者: 简体字    时间: 2015-3-10 23:56
我爱黑马币。
作者: 2119391569    时间: 2015-3-11 09:09
看不懂,不过我会加倍努力,早日进入黑马!
作者: 袁梦希    时间: 2015-3-11 09:28
好长好长
作者: 埗箬    时间: 2015-3-11 09:49
本帖最后由 埗箬 于 2015-3-11 09:50 编辑
王震阳老师 发表于 2015-3-10 10:57
你是在看着学吗?

我现在还在复习基础,同时看到第二课。编程的话,暂时只有初中级课程的样子。反正不懂就问呗。不然死活都不会了。
作者: 王震阳老师    时间: 2015-3-11 09:59
埗箬 发表于 2015-3-11 09:49
我现在还在复习基础,同时看到第二课。编程的话,暂时只有初中级课程的样子。反正不懂就问呗。不然死活都 ...

加油!
作者: 王震阳老师    时间: 2015-3-11 09:59
袁梦希 发表于 2015-3-11 09:28
好长好长

是呀,每天的内容都很多。
作者: 李培根    时间: 2015-3-11 15:57
总结的内容很全面啊

作者: zhaotiao3080    时间: 2015-3-12 00:22
prifict::):)
作者: 王震阳老师    时间: 2015-3-12 08:55
后面的课程会陆续更新,敬请期待。。。
作者: 默桑    时间: 2015-3-12 20:20
每天都逛帖,赞一个~很不错
作者: 王震阳老师    时间: 2015-3-12 20:21
默桑 发表于 2015-3-12 20:20
每天都逛帖,赞一个~很不错

希望能对你有帮助。
作者: 九个太阳学程序    时间: 2015-3-12 20:35
受教了!
作者: 王震阳老师    时间: 2015-3-12 20:48
九个太阳学程序 发表于 2015-3-12 20:35
受教了!

希望对你能有帮助。
作者: 李春江    时间: 2015-3-13 10:54
大赞技术码,收益匪浅
作者: 王震阳老师    时间: 2015-3-13 11:14
李春江 发表于 2015-3-13 10:54
大赞技术码,收益匪浅

希望对你有帮助。
作者: smartisan    时间: 2015-3-13 17:00
really good,thanks
作者: 179407246    时间: 2015-3-13 21:09
总结的内容很全面啊
作者: paul.li    时间: 2015-3-13 21:25
信息量好大!!!
作者: Mr杨鹏    时间: 2015-3-13 23:29
强力来顶,祝福黑马越办越好
作者: 夏鹏    时间: 2015-3-14 16:24
看完这些 是不是黑马就不用去了 老师
作者: 王震阳老师    时间: 2015-3-14 16:42
夏鹏 发表于 2015-3-14 16:24
看完这些 是不是黑马就不用去了 老师

这才6篇文档,我要写完估计有60篇。你要把60篇都看完黑马就不用来了。
作者: 夏鹏    时间: 2015-3-14 16:58
王震阳老师 发表于 2015-3-14 16:42
这才6篇文档,我要写完估计有60篇。你要把60篇都看完黑马就不用来了。

看来系统的学习还是有必要的
作者: zailushang326    时间: 2015-3-14 21:49
看着好难的样子
作者: 唐僧    时间: 2015-3-14 22:41
自己看不是看不懂,自制能力〒_〒……
作者: 虚谷    时间: 2015-3-15 06:31
这个很好很不错
作者: 梅西    时间: 2015-3-15 11:27
mark。总结的真是不错
作者: 小亮smile    时间: 2015-3-15 22:24
很好  赞一个!!!!1
作者: a1301155262    时间: 2015-3-18 22:54
总结的很好
作者: Dawn3    时间: 2015-3-18 23:12
现在是关注中
作者: yh903450130    时间: 2015-3-23 21:51
现在是关注中
作者: 王震阳老师    时间: 2015-3-23 22:01
yh903450130 发表于 2015-3-23 21:51
现在是关注中

最新的文章放在最新的Android版块中。
作者: macover    时间: 2015-3-23 22:47
收藏先,非常感谢
作者: 萍水相逢    时间: 2015-3-24 09:02
谢谢阳哥的笔记
作者: mayor125    时间: 2015-3-24 10:22
顶顶顶    赞 ~
作者: 邓士林    时间: 2015-3-24 23:54
我来下载了..
作者: 执笔画梦    时间: 2015-3-25 13:24
阳哥辛苦了
作者: psttt    时间: 2015-3-28 01:01
隐藏了什么?。。。。。
作者: 奔跑的孙莹    时间: 2015-3-29 00:45
阳哥 我要把你的资料都下载啦 你写的太好了!
作者: hamesksk    时间: 2015-4-1 17:32
拿附件学习05
作者: li子文    时间: 2015-4-1 19:00
太好了,怎么全的笔记,谢谢楼主
作者: 小小的黑马    时间: 2015-4-2 18:56
赞一个!!!!!!!!!!!!!!!!
作者: 卢乾荣    时间: 2015-4-2 21:46
Android中用java的网络编程的东西会很多吗
作者: fankaiqiangnj    时间: 2015-4-2 21:55
Adroid学数据库相关知识吗
作者: 屠赞华    时间: 2015-4-2 22:26
来过  还在努力学习中
作者: 18234133910    时间: 2015-4-2 22:35
很多啊···
作者: 千玉屑    时间: 2015-4-2 23:14
继续加油

作者: 朱闹闹    时间: 2015-4-2 23:42
加油,时间不多了
作者: 陈胜华    时间: 2015-4-3 00:18
在努力中。。。
作者: 朱军    时间: 2015-4-3 00:19
我还在传智博客学习中,向往这种感觉
作者: Peng苏    时间: 2015-4-3 00:24
好好加油了
作者: 晓月清晖明    时间: 2015-4-3 00:27
向着黑马前进,谁都无法阻挡我前进的脚步
作者: 王震阳老师    时间: 2015-4-3 08:37
朱军 发表于 2015-4-3 00:19
我还在传智博客学习中,向往这种感觉

加油。
作者: 王震阳老师    时间: 2015-4-3 08:39
奔跑的孙莹 发表于 2015-3-29 00:45
阳哥 我要把你的资料都下载啦 你写的太好了!

感谢支持。加油。
作者: 时间都去哪了    时间: 2015-4-5 00:26
谢谢分享
作者: 剑雨飘扬    时间: 2015-4-9 18:18
感谢感谢~
作者: Doug    时间: 2015-4-12 23:38
回帖领pdf
作者: z47057554    时间: 2015-4-13 00:12
谢谢分享
作者: lbl624    时间: 2015-4-13 22:08
谢谢分享啊,非常有用
作者: 鲁柯    时间: 2015-4-15 20:35
保存下来慢慢看
作者: sinbad88    时间: 2015-4-15 21:24
阳哥,多谢
作者: Hosing    时间: 2015-4-15 23:14
Thanks for Yang Brother's Note!
作者: 王震阳老师    时间: 2015-4-15 23:19
Hosing 发表于 2015-4-15 23:14
Thanks for Yang Brother's Note!

You are welcome!
作者: 王震阳老师    时间: 2015-4-15 23:19
sinbad88 发表于 2015-4-15 21:24
阳哥,多谢

不谢,多谢支持、
作者: Hosing    时间: 2015-4-15 23:22
王震阳老师 发表于 2015-4-15 23:19
You are welcome!

阳歌用的什么工具做的笔记,可否分享一下?:lol
作者: 福禄娃    时间: 2015-4-18 09:54
:handshake 多谢阳哥了。
作者: zhou1234    时间: 2015-4-18 22:57
阳哥你真是太帅了
作者: 王震阳老师    时间: 2015-4-19 08:55
zhou1234 发表于 2015-4-18 22:57
阳哥你真是太帅了

至于吗?
作者: 不存在的奇迹    时间: 2015-4-19 08:57
过来看一看 好像看不懂:dizzy:
作者: 彭春晓    时间: 2015-4-19 15:02
ndroid教程-Android基础05网络编程&消息处... [修改]
作者: 枪杆不如笔杆    时间: 2015-4-24 10:08
每帖必顶!
作者: zhuchangbao    时间: 2015-4-24 10:15
很有帮助,受益匪浅。
作者: Catface    时间: 2015-4-28 10:20
前来学习一下
作者: godmmm    时间: 2015-5-9 14:41
顶顶顶,支持杨哥
作者: DxxD    时间: 2015-5-17 21:48
看看:lol
作者: 志强    时间: 2015-5-18 08:10
支持一下,现在还不懂。
作者: 武召胜    时间: 2015-5-24 00:21
阳哥v587
作者: abc1190@126.com    时间: 2015-5-24 00:36
真实无假,赶快来吧!
作者: guoyangpeng    时间: 2015-5-24 09:14
大神啊!
作者: 二大爷    时间: 2015-5-24 09:24
大神啊  膜拜
作者: 别想太多    时间: 2015-5-24 11:04
总结的内容很全面啊
作者: xiaoxu    时间: 2015-5-24 22:17
总结得很详细,good
作者: yjsf216    时间: 2015-5-25 20:51
要下要 下下
作者: shentan000    时间: 2015-5-25 20:58
留名慢慢看~~~~
作者: 739262720    时间: 2015-5-27 00:17
感谢杨哥。来看看
作者: play1369    时间: 2015-5-28 00:39
多谢分享
作者: feng0606    时间: 2015-5-28 00:44
压根就看不懂啊
作者: 海行者    时间: 2015-5-28 16:52
跟着阳哥好好学习Android
作者: 想不到了解    时间: 2015-6-3 00:01
要学了赶紧下下
作者: 奋斗的黑马    时间: 2015-6-7 17:17
阳哥写的真是很仔细呀!!大大的赞一个
作者: 奋斗的黑马    时间: 2015-6-7 17:31
讲的很是仔细呀,,
作者: 执梦而行    时间: 2015-6-7 23:41
正需要呢:victory:
作者: 油炸电视剧    时间: 2015-6-11 14:20
资料在手,天下我有。
作者: edithe    时间: 2015-6-11 15:30
果然,恩,不错
作者: sk0806    时间: 2015-6-11 18:57
阳哥,多久更新一次
作者: 那一世的苍白    时间: 2015-6-11 21:18
学习了,好长啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2