package com.example.asynctask;
/* 功能:点击按钮后开始下载设置网页中的图片
* 利用了异步任务的功能。
* 2015-1-26,视频6.1,6.2
* */
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Button button;
private ImageView imageView;
// 在清单中加Permission授权访问Internet
// 添加网络图片的路径。
private final String IMAGE_PATH = "http://www.baidu.com/img/bdlogo.png";
//如果是本地要加IP和端口及目录。
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) this.findViewById(R.id.button1);
dialog = new ProgressDialog(this);
dialog.setTitle("提示");
dialog.setCancelable(false);
dialog.setMessage("正在下载图片,请稍候……");
imageView = (ImageView) this.findViewById(R.id.imageView1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//执行异步任务。
new MyTask().execute(IMAGE_PATH);
}
});
}
/*下面是异步任务MyTask。
* 一步任务执行下载网上图片的控件。 这个是个抽象类必定有一个抽象的方法。是doInBackground,这个异步任务戳必须要做的。
*/
public class MyTask extends AsyncTask<String, Integer, byte[]> {
// 参数1是异步任务需要执行的东西,访问网络的网址。第二个参数是刻度的单位类型是integer,第三个参数是结果,后台执行的结果,返回图片是Byte[]字节数组
// 没有参数时候用Void型。
@Override
protected void onPreExecute() {
// 若没有提示框,这个步骤不用调。如果不需要把得到的结果给UI,最后一个步骤不能调。不需要更新进度条就不用步骤三
//首先设置dialog显示。
super.onPreExecute();
dialog.show();
};
protected byte[] doInBackground(String... params) {
// TODO Auto-generated method stub 这是步骤二
// 会上面一个步骤执行后会立即执行,这是一个后台操作,这个参数是表示要执行的路径。对应于String。会计算出来以返回给最后一个步骤
// 在这个步骤中可以用publishProgess把进度发布给UI线程给第三个步骤。有算法。
//后台执行的操作,返回结果给onPostExecute
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
byte[] result = null;
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toByteArray(httpResponse.getEntity());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return result;
}
@Override
protected void onPostExecute(byte[] result) {
// TODO Auto-generated method stub
//取得结果,在这里更新UI
super.onPostExecute(result);
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
imageView.setImageBitmap(bitmap);
dialog.dismiss();
}
}
}
详细还是看注释吧,多练才可以学得。
运行没问题,给图片也没什么意义了。