Android开发网络图片查看器
互联网图片查看器
-
明确照片的网站地址
-
推送http要求
URL url = new URL(address); //获得联接目标,并沒有创建联接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设定联接和载入请求超时 conn.setConnectTimeout(5000); conn.setReadTimeout(5000); //设定要求方式,留意务必英文大写 conn.setRequestMethod("GET"); //创建联接,推送get请求 //conn.connect(); //创建联接,随后获得回应吗,200表明要求取得成功 conn.getResponseCode();
-
网络服务器的照片是以流的方式回到给电脑浏览器的
//取得缺少对象的键入流 InputStream is = conn.getInputStream(); //把流里的数据信息载入出去,并结构成照片 Bitmap bm = BitmapFactory.decodeStream(is);
-
把照片设定为ImageView的表明內容
ImageView iv = (ImageView) findViewById(R.id.iv); iv.setImageBitmap(bm);
-
加上管理权限
<uses-permission android:name="android.permission.INTERNET"/>
互联网要求
主线任务程堵塞
-
主线任务程又被称为UI进程,由于仅有在主线任务程中才可以更新UI。假如必须在子进程中更新UI,应用消息队列体制
-
在Android中,主线任务程被堵塞会造成UI终止更新,运用没法回应客户实际操作,客户体验将十分差
-
一切用时实际操作也不应当在主线任务程开展,不然很有可能使主线任务程堵塞
-
由于互联网互动归属于用时实际操作,假如网速很慢,编码会堵塞,因此 互联网互动的编码不可以写在主线任务程
-
主线任务程堵塞時间太长,便会抛出去ANR(Application Not Responding,即运用无响应)出现异常
消息队列体制
-
主线任务程建立时,系统软件会另外建立消息队列(MessageQueue)目标和信息轮询器(Looper)目标
-
轮询器的功效便是不断的检验消息队列中是不是有信息(Message)
-
消息队列一旦有信息,轮询器便会把信息目标发送给信息CPU(Handler)
-
CPU会启用handleMessage()方式来解决这条信息,handleMessage()方式运作在主线任务程中,因此 能够更新UI
android.os.Handler handler = new android.os.Handler(){ //主线任务程中有一个信息轮询器Looper,持续检验消息队列中是不是有最新动态,假如发觉有最新动态,全自动启用此方式,留意此方式是在主线任务程中运作的,因此 能够更新UI public void handleMessage(Message msg) { } };
-
在子进程中往消息队列里发信息
//建立信息目标 Message msg = new Message(); //信息的obj特性能够取值一切目标,这一特性使信息能够带上数据信息 msg.obj = bm; //what特性等同于一个标识,用以区别出不一样的信息,进而运作不可以的编码 msg.what = 1; //推送信息 handler.sendMessage(msg);
-
根据switch句子区别不一样的信息
public void handleMessage(android.os.Message msg) { switch (msg.what) { //假如是1,表明归属于要求取得成功的信息 case 1: ImageView iv = (ImageView) findViewById(R.id.iv); Bitmap bm = (Bitmap) msg.obj; iv.setImageBitmap(bm); break; case 2: Toast.makeText(MainActivity.this, "要求不成功", 0).show(); break; } }
小结:只需消息队列中有信息,handleMessage()方式便会启用。子进程假如必须更新UI,只必须应用CPU目标的sendMessage()方式憧憬消息队列中发一条信息,开启handleMessage()方式就可以
添加缓存文件照片的作用
-
把缺少对象的流里的数据信息载入出去,随后根据文档键入流写至本地文件
//1.取得缺少对象的键入流 InputStream is = conn.getInputStream(); //2.把流里的数据信息载入出去,并结构成照片 FileOutputStream fos = new FileOutputStream(file); byte[] b = new byte[1024]; int len = 0; while((len = is.read(b)) != -1){ fos.write(b, 0, len); }
-
建立bitmap目标的编码改为
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
-
每一次推送要求前检验一下在缓存文件中是不是存有同名的照片,假如存有,则载入缓存文件
获得开放源码的网址
-
code.google.com
-
github.com
-
在github检索smart-image-view
-
免费下载开源项目smart-image-view
-
应用自定部件时,标识姓名要写包名
<com.loopj.android.image.SmartImageView/>
-
SmartImageView的应用
SmartImageView siv = (SmartImageView) findViewById(R.id.siv); siv.setImageUrl("http://192.168.1.102:8080/dd.jpg");
Html源文件查看器
-
推送GET要求
URL url = new URL(path); //获得联接目标 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设定联接特性 conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); //创建联接,获得回应吗 if(conn.getResponseCode() == 200){ }
-
获得缺少对象的流,从流中把html源代码载入出去
byte[] b = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = is.read(b)) != -1){ //把看到的字节数先载入字节二维数组輸出流中存起來 bos.write(b, 0, len); } //把字节数二维数组輸出流中的內容转化成字符串数组 //默认设置使用utf-8 text = new String(bos.toByteArray());
错码的解决
-
错码的出現是由于服务端和手机客户端时速表不一致造成
//手动式特定时速表 text = new String(bos.toByteArray(), "gb2312");
递交数据信息
GET方法递交数据信息
-
get方法递交的数据信息是立即拼凑在url的结尾
final String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" name "&pass=" pass;
-
推送get请求,编码和以前一样
URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setReadTimeout(5000); conn.setConnectTimeout(5000); if(conn.getResponseCode() == 200){ }
-
电脑浏览器在推送要求带上数据信息的时候会对数据信息开展URL编码,大家敲代码时也必须为汉语开展URL编码
String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" URLEncoder.encode(name) "&pass=" pass;
POST方法递交数据信息
-
post递交数据信息是用流写給网络服务器的
-
协议书头中多了2个特性
-
Content-Type: application/x-www-form-urlencoded,叙述递交的数据信息的mimetype
-
Content-Length: 32,叙述递交的数据信息的长短
//给请求头加上post多出去的2个特性 String data = "name=" URLEncoder.encode(name) "&pass=" pass; conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", data.length() "");
-
-
设定容许开启post要求的流
conn.setDoOutput(true);
-
获得联接目标的輸出流,往流里写要递交给网络服务器的数据信息
OutputStream os = conn.getOutputStream(); os.write(data.getBytes());