使用AsyncTask实现图片加载
2015-12-02 14:10
337 查看
如上图所示:我们看到的就是使用PrograssDialog进度条和AsyncTask异步任务实现的效果(额,不要看应用名。。。)。下面介绍一下具体的实现流程。
一、首先使用XML布局,布局很简单直接上代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.weifengzz.httpclientdemo.MainActivity$PlaceholderFragment" > <Button android:id="@+id/getImage_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/img" android:layout_marginTop="22dp" android:text="获取图片" /> <ImageView android:id="@+id/img" android:layout_width="200dp" android:layout_height="200dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:scaleType="fitCenter" android:src="@drawable/ic_launcher" /> </RelativeLayout>
二、MainActivity类主要就是对组件的初始化。
public class MainActivity extends Activity { private Button button = null;// 按钮 private ImageView imageView = null;// 图片 private ProgressDialog progressDialog = null;// 进度条 private String imgPath = "http://images.ent.xunlei.com/660x1500/189/120818zknfkvg2vtpupxyjdruovsafnj7mbmikn5yh7mpe.jpg";// 图片的地址 private DownLoadImage downLoadImage = null;// AsyncTask异步任务类 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intView(); //点击加载图片 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub downLoadImage.execute(imgPath); } }); } /** * 初始化组件 * */ private void intView() { button = (Button) findViewById(R.id.getImage_btn); imageView = (ImageView) findViewById(R.id.img); progressDialog = new ProgressDialog(MainActivity.this); downLoadImage = new DownLoadImage(imageView, progressDialog); } }
三、DownLoadImage类的实现,此类继承了 AsyncTask异步任务类
public class DownLoadImage extends AsyncTask<String, Integer, byte[]> { private ProgressDialog progressDialog = null;//进度条 private ImageView iv = null; //图片控件 public DownLoadImage(ImageView imageView,ProgressDialog progressDialog) { this.progressDialog = progressDialog; this.iv = imageView; } /** * 首次调用的方法,通常我们在此方法中可以初始化一些组件 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progressDialog.setTitle("下载");//设置标题 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置样式 progressDialog.setMessage("正在加载,请稍后...");//设置显示的文字 progressDialog.show(); } /** * 执行耗时的操作,请求网络数据 String... params:可变的数组 */ @Override protected byte[] doInBackground(String... params) { // TODO Auto-generated method stub ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int temp = 0; //使用HttpClient获取数据 HttpClient httpClient = new DefaultHttpClient(); HttpGet hg = new HttpGet(params[0]); try { HttpResponse httpResponse = httpClient.execute(hg); if (httpResponse.getStatusLine().getStatusCode() == 200) { InputStream inputStream = httpResponse.getEntity().getContent(); long length = httpResponse.getEntity().getContentLength(); int current = 0; //每次读10个字节,如果读的字节数据比较多的话,进度条会显示的不是那么流畅,会有很大的跳跃感 byte[] bt = new byte[10]; //循环读取数据 while ((temp = inputStream.read(bt)) != -1) { //如果没有取消就每循环一次更新一次进度条 if (!this.isCancelled()) { current += temp; publishProgress((int) ((current / (float) length) * 100)); //输出流 outputStream.write(bt, 0, temp); } } } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return outputStream.toByteArray(); } /** * 调用完publishProgress之后会执行此方法,更新刻度 */ @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); progressDialog.setProgress(values[0]); } /** * 运行在UI线程中 执行完doInbackgroud方法之后,系统会调用此方法, 并且把doInbackground方法返回的结果传给此方法 */ @Override protected void onPostExecute(byte[] result) { // TODO Auto-generated method stub super.onPostExecute(result); // 把byte数组转成Bitmap位图对象 Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length); iv.setImageBitmap(bitmap); // 关闭对话框 progressDialog.dismiss(); } }
四、最后不要忘记添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
相关文章推荐
- 虚拟机环境linux网络配置
- VMware Horizon虚拟桌面工具箱2.0-审计,远程协助,控制台,电源
- DOM、JDOM、DOM4J的区别
- asp.net DataTable 进行表内排序
- 查看锁信息
- spring源码解析-Ioc1
- jquery+java选中批量删除
- 4.7编写一个函数,从一个字符串中去除多余的空格。
- SCF架构开发:Maven+weblogic+eclipse开发总结
- tar 解压缩命令详解
- UITextView使用总结
- Fork/Join实例
- 编程基础知识之变量赋值
- js的input框限制输入内容
- Github使用gitignore忽略增加指定文件
- PCA目标函数的推导
- QT Qdesktopwidget
- font-awesome
- 测试用例的初始化和结束函数
- [浅析]淘宝详情页的BigRender优化的最佳方式