目录
1. 概述
2. HTTP协议
(1)在TCP/IP协议栈中的位置
(2)HTTP的请求响应
(3)工作流程
(4)请求包示例:
(5)应答包示例:
3. 检查网络连接状态
(1)判断是否有网络连接
(2) 检查是否是 wifi网络是否可用
(3) 检查当前网络连接的类型信息
4. 显示网络图片
图片加载方法
(1)runOnUiThread方法
(2)view.post 方法
如今,移动端APP渗透到各行各业,数量难以计数,几乎所有应用都会使用到网络,掌握Android网络编程是APP开发是核心技术,必备技术。这是因为移动设备的计算能力、存储能力都是有限的。因此移动设备依赖网络计算、存储就成为了主要的方式,重要程度就不言而喻了。
Android完全支持JDK本身的TCP、UDP网络通信的APl,也就是我们在JAVASE阶段讲解的网络编程,也叫Socket编程,Android也支持基于HTTP协议的URLConnection,并内置Apache HttpClient APl来简化HTTP的操作。
本课程我们将介绍当前最常用的网络编程枝术,包括:URLConnection、Apache HttpClient、WebService、Volley(Google官方推荐框架/组件)、android-async-http、WebView。
HTTP是Hyper Text Transfer Protocol(超文本传输协议),它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC,RFC1945定义了HTTP/1.0版本。其中最著名的就是RFC 2616。RFC2616定义了今天普遍使用的一个版本—HTTP1.1。
HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。
如下图所示:默认HTTP的端口号为80,HTTPS的端口号为443。
这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。
HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
HTTP请求包(GET?POST等请求方法)由三个部分构成,分别是:方法-URI-协议/版本,请求头,请求正文。下面是一个HTTP协议请求包(GET)的例子:
1、GET/index.jsp HTTP/1.1
2、Accept-Language:zh-cn
3、Connection:Keep-Alive
4、Host:192.168.0.106
5、Content-Length:37
6、userName=vince&password=123456
和HTTP请求包相似,由三个部分构成,分别是:协议-状态代码-描述,应答头,应答正文。下面是一个HTTP应答的例子:
1、HTTP/1.1200OK
2、Server:Microsoft-llS/4.03、Date:Mon,3 Jan 2005 13:13:33 GMT
4、Content-Type:text/html
5、Last-Modified:Mon,11 Jan 2004 13:23:42 GMT
6、Content-Length:90
7、
添加权限:
public boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
public boolean isNetworkType(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mNetworkInfo != null) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
public static int getConnectType(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
return mNetworkInfo.getType();
}
}
return -1;
}
public Bitmap getPicture(String path) {
Bitmap bm = null;
try {
URL url = new URL(path); //创建URL对象
URLConnection conn = url.openConnection(); //获取URL对象对应的连接
conn.connect(); //打开连接
InputStream is = conn.getInputStream(); //获取输入流对象
bm = BitmapFactory.decodeStream(is); //根据输入流对象创建Bitmap对象
} catch (MalformedURLException e1) {
e1.printStackTrace(); //输出异常信息
} catch (IOException e) {
e.printStackTrace(); //输出异常信息
}
return bm;
}
btmRunOnUiThread.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap btm = getPicture("https://img3.doubanio.com/view/subject/l/public/s27308766.jpg");
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(btm);
}
});
}
}).start();
}
});
btmViewPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap btm=getPicture("https://img3.doubanio.com/view/subject/l/public/s27308766.jpg");
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(btm);
}
});
}
}).start();
}
});