01_网络图片查看器(重点)
向服务器端发送请求的常用方式:GET、POST
-
步骤:
1、创建一个URL,打开一个HTTP的连接;
2、设置请求头信息;
3、获取服务器端返回的响应数据,判断响应码,200ok,404找不到资源、503服务器内部错误,然后获取输入流;
4、把二进制流数据转换成一个图片,并显示在Imageview;
模版代码:
// 1、创建一个URL,打开一个HTTP的连接; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 2、设置请求头信息; conn.setRequestMethod("GET");//默认是GET方式,大写 conn.setConnectTimeout(3000); // conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); // 3、获取服务器端返回的响应数据,判断响应码,200ok,404找不到资源、503服务器内部错误,然后获取输入流; int code = conn.getResponseCode(); if(code == 200){ //获取返回的二进制数据流 InputStream is = conn.getInputStream(); // 4、把二进制流数据转换成一个图片,并显示在Imageview; Bitmap bm = BitmapFactory.decodeStream(is); iv.setImageBitmap(bm); }else{ //提示用户信息 Toast.makeText(this, "服务器端返回数据失败", 0).show(); }
-
android.os.NetworkOnMainThreadException:网络在主线程上的异常
-
android4.0之后,google为了让UI界面运行的更加流畅,强制要求访问网络的操作不能再主线程中进行。这样就避免了在主线程因为访问网络时间太长,导致界面卡死等现象的发生。
-
运行activity的线程就是主线程(UI线程),oncreate、单击事件的响应方法都是运行在主线程里面的。
02_子线程不能修改UI界面
Only the original thread that created a view hierarchy can touch its views:
只有创建UI界面的线程才能修改UI界面,谁创建的界面谁才能修改。
子线程不能直接修改UI界面,只有主线程(UI线程)才能修改UI界面。
子线程可以修改UI界面,修改UI界面之后,系统会自动判断当前线程是不是主线程,如果不是主线程,就会立即终止程序的运行。
03_消息处理机制的原理(重点)
-
步骤:
1、创建handler对象 private Handler handler = new Handler(){ //接收消息、处理消息 public void handleMessage(Message msg) { }; }; 2、得到handler的引用,向主线程发送一个消息 // iv.setImageBitmap(bm); //把消息放入消息盒子中 Message msg = new Message(); msg.obj = bm; //向主线程发送一个消息 handler.sendMessage(msg); 3、handler修改UI界面 private Handler handler = new Handler(){ //接收消息、处理消息 public void handleMessage(Message msg) { Bitmap bm = (Bitmap) msg.obj; iv.setImageBitmap(bm); }; };
-
handler的工作机制原理( Handler、message、Looper三者之间的关系):
前提知识: 所有使用UI界面的操作系统,后台都在运行着一个死循环,它在不停地监听和接收用户发出的指令,一旦接收到指令,就马上执行。 我们的应用程序一旦运行起来,系统就会给它提供一个轮询器Looper,Looper内部维护了一个消息队列(MessageQueue)。当子线程调用handler的sendMessage方法发送消息(Message)的,会把消息放到消息队列里。Looper不停的从消息队列中去消息,取到消息后会马上发送给handler,handler来修改UI界面。
04_网络HTML查看器
代码:
package com.itheima.htmlview;
import java.io.InputStream;
import jav