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.widget.ImageView; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; // TODO 使用异步任务实现点击按钮下载图片到ImageView控件上 public class MainActivity extends Activity { private ImageView imageView; private static final String IMAGE_PATH = "http://b.hiphotos.baidu.com/image/pic/item/279759ee3d6d55fbb3586c0168224f4a20a4dd7e.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.iv_01); } public void btnClick(View view) { //点击按钮 new MyTask().execute(IMAGE_PATH); //开启异步任务 } // AsyncTask是个抽象类,继承时需要设定三个泛型Params,Progress和Result的类型 如<String , Integer, Bitmap> // Params 是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型 // Progress是指更新进度时传递的参数类型,即publishProgress()和onProgressUpdate()的参数类型 // Result 是指doInBackground()的返回值类型 class MyTask extends AsyncTask<String, Integer, Bitmap> { private ProgressDialog dialog;//带进度条的提示框 //第一个执行的方法,这个方法在主线程中 做一些准备工作 例如:弹出进度匡 @Override protected void onPreExecute() { super.onPreExecute(); dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("提示!!"); dialog.setMessage("正在下载中...."); dialog.show(); } //在子线程中执行 其他方法在主线程中执行直接可以进行耗时操作 @Override protected Bitmap doInBackground(String... params) { String path = params[0];//传递过来的条件 ByteArrayOutputStream outputStream = null; try { URL url = new URL(path); //开启连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //开启链接 conn.setReadTimeout(5000); //设置读取超时事件 conn.connect(); if (conn.getResponseCode() == 200) { InputStream inputStream = conn.getInputStream(); //获取输入流 outputStream = new ByteArrayOutputStream();//创建输出流 byte[] bt = new byte[8 * 1024]; int len = 0; while ((len = inputStream.read(bt)) != -1) { outputStream.write(bt, 0, len); outputStream.flush(); } byte[] array = outputStream.toByteArray(); //把输出流转化成Byte数组 //在doInBackground方法中进行return 就会把return的数据传到onPostExecute return BitmapFactory.decodeByteArray(array, 0, array.length); } } catch (Exception e) { e.printStackTrace(); } finally { if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); if (result != null) { imageView.setImageBitmap(result); //设置控件,显示图片,主线程的onPostExecute可以改变控件状态,子线程则不能. } dialog.dismiss();// 关闭onPreExecute中开启的Dialog } } }
使用AsyncTask完成点击按钮下载图片到ImageView控件上
最新推荐文章于 2017-09-26 10:30:00 发布