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();
} }
效果图:图片大小可以设置