Android带进度条的下载图片示例(AsyncTask异步任务)

Android带进度条的下载图片示例(AsyncTask异步任务),第1张

概述为什么要用异步任务?在Android中只有在主线程才能对ui进行更新 *** 作,而其它线程不能直接对ui进行 *** 作

为什么要用异步任务?

在AndroID中只有在主线程才能对ui进行更新 *** 作,而其它线程不能直接对ui进行 *** 作

androID本身是一个多线程的 *** 作系统,我们不能把所有的 *** 作都放在主线程中 *** 作 ,比如一些耗时 *** 作。如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常。所以我们要使用异步任务。androID为我们提供了一个封装好的组件asynctask。

AsyncTask可以在子线程中更新ui,封装简化了异步 *** 作。适用于简单的异步处理。如果多个后台任务时就要使用Handler了 在这里就不再说明。

AsyncTask通常用于被继承。AsyncTask定义了三种泛型类型<Params,Progress,Result>

Params:启动任务时输入的参数类型 Progress:后台任务执行的百分比 Result:执行任务完成后返回结果的类型

继承AsyncTask后要重写的方法有:

doInBackgroud:必须重写,异步执行后台线程要完成的任务,耗时任务要写在这里,并且在这里不能 *** 作ui。可以调用 publishProgress方法来更新实时的任务进度

onPreExecute:执行耗时 *** 作前调用,可以完成一些初始化 *** 作

onPostExecute:在doInBackground 执行完成后,主线程调用此方法,可以在此方法中 *** 作ui

onProgressUpdate:在doInBackgroud方法中调用publishProgress方法,更新任务的执行进度后 就会调用这个方法

下面通过一个实例来了解AsyncTask

首先附上运行结果

布局文件:

<linearLayout 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"  androID:orIEntation="vertical" >  <button   androID:ID="@+ID/btn_download"   androID:layout_wIDth="wrap_content"   androID:layout_height="wrap_content"   androID:layout_gravity="center_horizontal"   androID:text="点击下载" />  <FrameLayout   androID:layout_wIDth="fill_parent"   androID:layout_height="fill_parent" >   <ImageVIEw    androID:ID="@+ID/iv_image"    androID:layout_wIDth="fill_parent"    androID:layout_height="fill_parent"    androID:scaleType="fitCenter" />  </FrameLayout> </linearLayout> 

MainActivity

package com.example.asynctask; import java.io.BufferedinputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.inputStream; import java.net.MalformedURLException; import java.net.URLConnection; import androID.os.AsyncTask; import androID.os.Bundle; import androID.app.Activity; import androID.app.ProgressDialog; import androID.graphics.Bitmap; import androID.graphics.BitmapFactory; import androID.vIEw.VIEw; import androID.vIEw.VIEw.OnClickListener; import androID.Widget.button; import androID.Widget.ImageVIEw; public class MainActivity extends Activity implements OnClickListener{  private ImageVIEw image;  private ProgressDialog progress;  private button btn_download;  private static String URL="http://img4.imgtn.bdimg.com/it/u=1256159061,743487979&fm=21&gp=0.jpg";  @OverrIDe  protected voID onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentVIEw(R.layout.activity_main);   image=(ImageVIEw) findVIEwByID(R.ID.iv_image);   btn_download=(button) findVIEwByID(R.ID.btn_download);   progress=new ProgressDialog(this);   progress.setIcon(R.drawable.ic_launcher);   progress.setTitle("提示信息");   progress.setMessage("正在下载,请稍候...");   progress.setProgressstyle(ProgressDialog.STYLE_HORIZONTAL);   btn_download.setonClickListener(this);  }  @OverrIDe  public voID onClick(VIEw v) {   // Todo auto-generated method stub   new MyAsyncTask().execute(URL);  }  /*   * String*********对应我们的URL类型   * Integer********进度条的进度值   * BitMaP*********异步任务完成后返回的类型   * */  class MyAsyncTask extends AsyncTask<String,Integer,Bitmap>{   //执行异步任务(doInBackground)之前执行,并且在ui线程中执行   @OverrIDe   protected voID onPreExecute() {    // Todo auto-generated method stub    super.onPreExecute();    if(image!=null){     image.setVisibility(VIEw.GONE);    }    //开始下载 对话框进度条显示    progress.show();    progress.setProgress(0);   }   @OverrIDe   protected Bitmap doInBackground(String... params) {    // Todo auto-generated method stub    //params是一个可变长的数组 在这里我们只传进来了一个url    String url=params[0];    Bitmap bitmap=null;    URLConnection connection;    inputStream is;//用于获取数据的输入流    ByteArrayOutputStream bos;//可以捕获内存缓冲区的数据,转换成字节数组。    int len;    float count=0,total;//count为图片已经下载的大小 total为总大小    try {     //获取网络连接对象     connection=(URLConnection) new java.net.URL(url).openConnection();     //获取当前页面的总长度     total=(int)connection.getContentLength();     //获取输入流     is=connection.getinputStream();     bos=new ByteArrayOutputStream();     byte []data=new byte[1024];     while((len=is.read(data))!=-1){      count+=len;      bos.write(data,len);      //调用publishProgress公布进度,最后onProgressUpdate方法将被执行      publishProgress((int)(count/total*100));      //为了显示出进度 人为休眠0.5秒      Thread.sleep(500);     }     bitmap=BitmapFactory.decodeByteArray(bos.toByteArray(),bos.toByteArray().length);     is.close();     bos.close();    } catch (MalformedURLException e) {     // Todo auto-generated catch block     e.printstacktrace();    } catch (IOException e) {     // Todo auto-generated catch block     e.printstacktrace();    } catch (InterruptedException e) {     // Todo auto-generated catch block     e.printstacktrace();    }    return bitmap;   }   //在ui线程中执行 可以 *** 作ui   @OverrIDe   protected voID onPostExecute(Bitmap bitmap) {    // Todo auto-generated method stub    super.onPostExecute(bitmap);    //下载完成 对话框进度条隐藏    progress.cancel();    image.setimageBitmap(bitmap);    image.setVisibility(VIEw.VISIBLE);   }   /*    * 在doInBackground方法中已经调用publishProgress方法 更新任务的执行进度后    * 调用这个方法 实现进度条的更新    * */   @OverrIDe   protected voID onProgressUpdate(Integer... values) {    // Todo auto-generated method stub    super.onProgressUpdate(values);    progress.setProgress(values[0]);   }  } } 

最后不要忘记在AndroIDManifest文件中配置网络访问权限

<uses-permission androID:name="androID.permission.INTERNET"/> 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的Android带进度条下载图片示例(AsyncTask异步任务)全部内容,希望文章能够帮你解决Android带进度条的下载图片示例(AsyncTask异步任务)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存