package cn.com.uangel.asynctask; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URI; import org.apache.http.HttpEntity; 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 android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.ImageView; import android.widget.TextView; public class MainActivity extends Activity { ImageView imageView01; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) this.findViewById(R.id.textview); imageView01 = (ImageView) this.findViewById(R.id.imageview); GetImage getImage = new GetImage(); getImage.execute("http://hi.csdn.net/attachment/201010/27/0_1288149117Yk8W.gif"); Log.d("fff", "onCreat"); } private class GetImage extends AsyncTask<Object, Integer, Object> { public GetImage() { super(); // TODO Auto-generated constructor stub } @Override protected void onCancelled() { Log.i("fff", "onCancelled is running..."); super.onCancelled(); } @Override protected void onPostExecute(Object result) { /* * * 此方法在主线程执行,任务执行的结果作为此方法的参数返回 */ Log.i("fff", "onPostExecute is running..."); Log.i("fff", "result == null ? " + (result == null)); imageView01.setImageBitmap((Bitmap) result); super.onPostExecute(result); } @Override protected void onPreExecute() { /* * * 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件 */ Log.i("fff", "onPreExecute is running..."); super.onPreExecute(); } @Override protected void onProgressUpdate(Integer... values) { System.out.println("onProgressUpdate"); /* * * 此方法在主线程执行,用于显示任务执行的进度。 */ Log.i("fff", "onProgressUpdate is running..."); // 由publishProgress传递的值 Log.i("fff", "values " + values[0]); super.onProgressUpdate(values); } @Override protected Object doInBackground(Object... params) { /* * * 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。 * * 在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。 */ Log.i("fff", "doInBackground is running..."); try { Bitmap bitmap; HttpClient client = new DefaultHttpClient(); // params[0]代表连接的url URI uri = URI.create((String) params[0]); HttpGet get = new HttpGet(uri); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); Log.i("fff", "length: " + length); InputStream in = entity.getContent(); if (in != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); // // byte[] buf = new byte[128]; // // int ch = -1; // // int count = 0; // // while ((ch = in.read(buf)) != -1) { // // baos.write(buf, 0, ch); // // count += ch; // // if (length > 0) { // // // 如果知道响应的长度,调用publishProgress()更新进度 // // // onProgressUpdate读取进度 // // publishProgress((int) ((count / (float) length) * 100)); // // } // // // 为了在模拟器中清楚地看到进度,让线程休眠100ms // // // Thread.sleep(100); // // } publishProgress(100);//调用onProgressUpdate() bitmap = BitmapFactory.decodeStream(in); in.close(); baos.close(); return bitmap; } } catch (Exception e) { e.printStackTrace(); } return null; } } }