android studio中http访问网站的几种异常情况

Android对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口:

1、标准Java接口(java.net) ----HttpURLConnection,可以实现简单的基于URL请求、响应功能;

2、Apache接口(org.appache.http)----HttpClient,使用起来更方面更强大。一般来说,用这种接口。

本文主要是探索几种http使用方式的不正确的情况,这些情况都会引起不正确的异常程序关闭

第一种情况: 在android的事件处理函数中,直接调用网络函数进行网络访问,这种情况,会直接导致android程序停止运行

第二种情况:在android的事件出来函数中,启动一个线程, 在线程中访问网络, 网络访问完成后, 将数据传递给android的界面中的临时变量, 但是这个情况下, 事件出来函数中不知道什么时候网络完成,因此例子里面用的是线程的join方法, 这个方法可以等待另外线程(网络访问)完成, 然后在事件处理函数进行数据的处理,这个的问题是, join时事件处理线程(UI)不能在响应其他请求,特别是网络线程中有网络异常例如连接超时,网络速度缓慢, 也有些情况下,在网络访问线程中有死锁或者sleep等类似操作等,都会造成事件处理函数的 等待,严重影响用户体验甚至不能工作

第三种情况: 在网络处理函数中直接将 获取到的数据设置到 android界面中, 这个情况下, 事件处理函数不用在等待了, 他直接启动线程就完成了。但是这个情况下,android程序会直接退出。android禁止在非 ui(非主线程)线程中 访问ui元素,界面控件等

本程序中网络方面采用HttpURLConnection进行http的访问, 相关HttpURLConnection情况如下, 具体代码见下面的链接。

HttpURLConnection继承自 URLConnection类,用它可以发送和接口任何类型和长度的数据,且预先不用知道数据流的长度,可以设置请求方式get或post、超时时间。

下面直接贴代码,代码目的有两个,一是访问百度首页,获取其返回的html字符串,二是给定URL下载个图片并显示出来。后续将展开系列博文介绍HTTP相关知识。

两个核心文件都略了, 稍后提供完整的源代码, 如下:

链接: http://pan.baidu.com/s/1nt5guxj 密码: dmp3

activity_main.xml

MainActivity.java

必须注意的是:
AndroidManifest.xml 里记得加访问网络的权限:

<uses-permission android:name="android.permission.INTERNET"/>

否则访问不能成功

注意事项:

1、 使用HttpURLConnection的步骤是先实例化一个URL对象,通过URL的openConnection实例化 HttpURLConnection对象。然后设置参数,注意此时并没有发生连接。真正发生连接是在获得流时即conn.getInputStream这 一句时,这点跟TCP Socket是一样的。并非阻塞在ServerSocket.accept()而是阻塞在获取流。所以在获取流之前应该设置好所有的参数。

2、Android4.0后所有网络方面的操作都不能再主线程!!!在获取网页响应字符串时本文代码使用了Thread,在下载图片(后面在提供例子)时使用了AsyncTask,可以对比其使用的异同。很明显,AsyncTask更加方面。在onPreExecute和onPostExecute里可以很方面的做主线程UI的事。

3、 在获取网页字符串时,使用了线程的Thread.join函数,这会使在onClick里在join处进行阻塞,直到Thread的run执行完才会进行 判断,界面卡死。因此在实际开发中要尽量避免之中,解决方法是使用Thread+Handle的方式,或AsyncTask。实际上后者就是前者的封装。

下面是集中工作情况的截图,供参考:

 

在android的事件处理函数中进行的网络操作例子(异常退出)
在android的事件处理函数中进行的网络操作例子(异常退出)

运行结果如下:

android 程序异常退出

启动一个线程, 在线程中调用网络访问, 在网络访问中用sleep模拟长时间不返回的情况

这个情况下, 点击其他按钮是没有响应的
这个情况下, 点击其他按钮是没有响应的
在非ui线程中访问 android的ui元素,造成异常退出
在非ui线程中访问 android的ui元素,造成异常退出

运行结果:

异常退出

发表评论