它的工作原理特别的简单,就是客户端向服务器发出一条HTTP 请求,服务器收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理就可以了。(一般网络请求都要在子线程中进行,否则可能会导致页面卡顿情况)
//1.连接网络的Api : URL类。
try {
URL url = new URL("http://www.itheima.com/images_new/logo.jpg");
//http://www.itheima.com/images_new/logo.jpg --由于这里使用的是http协议去获得连接,所以获得的是
//HttpURLConnection的一个实例。
//2.建立一个连接 --- Connection 对象
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//连接网络的时候,有很多 不确定性...
//为了提供用户的感受,会设置一个连接超时的时间
conn.setConnectTimeout(5000);
//3.设置请求的方式,注意要使用大写的GET,POST.
conn.setRequestMethod("GET");
//拿到 返回的数据的类型
String contentType = conn.getContentType();
//返回数据的长度
int length = conn.getContentLength();
//拿到其他响应的消息头信息,根据key获取对应的信息.
//获取服务器容器类型,一般为tomcat.
conn.getHeaderField("Server");
//4.获得服务器返回的状态码,根据状态码去判断是否成功.
int code = conn.getResponseCode();
//200, 404,500,302,304 ...
if(code == 200){
//进来 则表示成功的处理了请求,返回了数据.
//获得返回的图片的 流数据
InputStream in = conn.getInputStream();
//如何去解析呢? --如何解析成一个图片显示.
//这个事儿经常要做,谷歌工程师已经帮咱们提供好了现成的类,可以将一个流数据转换为一个图片
Bitmap bitmap = BitmapFactory.decodeStream(in);//只要这个流是个图片,就可以转换成Bitmap(内存中的图片).
imageView.setImageBitmap(bitmap);
in.close();//关闭流
}
} catch (MalformedURLException e) {
e.printStackTrace();
}finally{
if(conn != null){
conn.disconnect();//关闭http连接
}
}
最后在清单文件中申请网络权限即可。
注意:为了提高用户的感受,不允许一些比较耗时的事儿,直接放在主线程中去做,比如:联网就是不确定性的,比较耗时的操作。
补充:关键点是对返回数据类型以及流 进行相应的解析。
POST提交数据和GET类似,,只需要将HTTP 请求的方法改成POST,并在获取输入流之前把要提交的数据写出即可。注意每条数据都要以键值对的形式存在,数据与数据之间用&符号隔开,比如说我们想要向服务器提交用户名和密码,就可以这样写:
connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=123456");