1、背景介绍
网络上图片的请求,是我们最常见的网络请求之一,不亚于对json/xml数据的请求。一般要展示给用户看的,都不会是纯粹的文字,往往都是图文信息。而在移动互联网时代,图文又往往需要最新的资讯,数据都是从网络上获取。
像我们都在使用的微信,它的朋友圈中就好多图文信息;使用的新浪微博,用户的图标也是图片信息,等等诸如此类。由此可见,对于图片的请求处理,非常重要,我们做开发的应该掌握。今天介绍一下笔者在开发Android项目过程中使用过的一些代码。
2、思路分析
(1)取得与服务器的连接
(2)设置链接属性
(3)从客户端获取数据
(4)生成图片,关闭链接
3、实例
1、创建android项目
2、找到图片,复制下载地址,如这张图片
3、mytest继承AsyncTask,在多线程里写,代码如下
package com.example.multithreadind01; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.List; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.view.View; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class MyTask extends AsyncTask { private BaseAdapter adapter; private List<User> userList; private MainActivity activity; public MyTask(MainActivity activity){ this.activity = activity; } private String errorMessage = ""; private String messageInfo = ""; private static final String URL_STR = "http://android2017.duapp.com/test1.jsp"; private static final String URL_img_STR = "http://cms-bucket.nosdn.127.net/c476803813014a5fa865f22c0faa340320161208080029.jpeg"; private String lastId = "123&1=1"; private Bitmap bitmap; //1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务) //2.绝对不能碰UI @Override protected Object doInBackground(Object... params) { try { //路径 URL url = new URL(URL_img_STR); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //对连接进行配置 conn.setDoOutput(false); conn.setDoInput(true); conn.setRequestMethod("GET");//403错误 //防止读取脏数据 conn.setUseCaches(false); if ( conn.getResponseCode() == 200){ //输入流 InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); conn.disconnect(); return "123"; } else{ errorMessage = "服务器繁忙,请稍后再试("+conn.getResponseCode()+")"; return "errorserver"; } } catch (Exception e) { errorMessage = e.getMessage(); return "errorclient"; } } //准备 @Override protected void onPreExecute() { Toast.makeText(activity, "开始执行...", Toast.LENGTH_SHORT).show(); } //做完后执行 @Override protected void onPostExecute(Object result) { String r = result.toString(); TextView tv = (TextView)activity.findViewById(R.id.textView1); if ("errorclient".equals(r)){ if (errorMessage.indexOf("No add")!=-1){ tv.setText("网络不通"); } else{ tv.setText("访问网络时其它异常:"+errorMessage); } }else if("errorserver".equals(r)){ tv.setText(errorMessage); }else{ tv.setText(r); //显示图片 ImageView iv = (ImageView)activity.findViewById(R.id.imageView1); iv.setImageBitmap(bitmap); } } //分步完成 @Override protected void onProgressUpdate(Object... values) { // TODO Auto-generated method stub //0,1,2,3,4 int bar = Integer.parseInt(values[0].toString()); bar = (bar+1)*20; ProgressBar progressBar = (ProgressBar)activity.findViewById(R.id.progressBar1); progressBar.setProgress(bar); adapter.notifyDataSetChanged(); } }
效果图:图片大小可以设置