介绍
在Android应用中利用异步任务实现一个进度条下载功能吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>为什么要用异步任务? 强>
在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作
Android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作,比如一些耗时操作。如果放在主线程中会造成阻塞而当阻塞事件过长时系统会抛出anr异常,所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask。
asynctask可以在子线程中更新ui,封装简化了异步操作。适用于简单的异步处理。如果多个后台任务时就要使用处理了在这里就不再说明。
asynctask通常用于被继承.AsyncTask定义了三种泛型类型& lt; Params,进步,Result>
- <李>参数:启动任务时输入的参数类型李> <李>进步:后台任务执行的百分比李> <李>结果:执行任务完成后返回结果的类型李>
<强>继承asynctask后要重写的方法有:强>
必须重写,异步执行后台线程要完成的任务,耗时任务要写在这里,并且在这里不能操作ui。可以调用publishProgress方法来更新实时的任务进度
执行耗时操作前调用,可以完成一些初始化操作
在doInBackground执行完成后,主线程调用此方法,可以在此方法中操作ui
在doInBackgroud方法中调用publishProgress方法,更新任务的执行进度后就会调用这个方法
下面通过一个实例来了解asynctask
首先附上运行结果
<强>布局文件:强>
& lt; LinearLayout xmlns: Android=癶ttp://schemas.android.com/apk/res/android" xmlns:工具=癶ttp://schemas.android.com/tools" android: layout_width=癿atch_parent" android: layout_height=癿atch_parent" android:取向=皏ertical"比; & lt;按钮 android: id=癅 + id/btn_download" android: layout_width=皐rap_content" android: layout_height=皐rap_content" android: layout_gravity=癱enter_horizontal" android:文本=暗慊飨略亍?/比; & lt; FrameLayout android: layout_width=癴ill_parent" android: layout_height=癴ill_parent"比; & lt; ImageView android: id=癅 + id/iv_image" android: layout_width=癴ill_parent" android: layout_height=癴ill_parent" android: scaleType=癴itCenter"/比; & lt;/FrameLayout> & lt;/LinearLayout>
<强> MainActivity 强>
包com.example.asynctask; 进口java.io.BufferedInputStream; 进口java.io.ByteArrayOutputStream; 进口java.io.IOException; 进口java.io.InputStream; 进口java.net.MalformedURLException; 进口java.net.URLConnection; 进口android.os.AsyncTask; 进口android.os.Bundle; 进口android.app.Activity; 进口android.app.ProgressDialog; 进口android.graphics.Bitmap; 进口android.graphics.BitmapFactory; 进口android.view.View; 进口android.view.View.OnClickListener; 进口android.widget.Button; 进口android.widget.ImageView; 公共类MainActivity扩展活动实现OnClickListener { 私人ImageView形象; 私人ProgressDialog进步; 私人按钮btn_download; 私有静态字符串URL=? http://img4.imgtn.bdimg.com/it/u=1256159061, 743487979, fm=21, gp=0. jpg"; @Override 保护无效onCreate(包savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); 形象=(ImageView) findViewById (R.id.iv_image); btn_download=(按钮)findViewById (R.id.btn_download); 进步=new ProgressDialog(这个); progress.setIcon (R.drawable.ic_launcher); progress.setTitle(“提示信息“); progress.setMessage(“正在下载,请稍候…“); progress.setProgressStyle (ProgressDialog.STYLE_HORIZONTAL); btn_download.setOnClickListener(这个); } @Override 公共空间onClick(查看v) {//TODO自动生成方法存根 新的MyAsyncTask () . execute (URL); }/* 字符串* * * * * * * * * *对应我们的URL类型 *整数* * * * * * * *进度条的进度值 *位图* * * * * * * * *异步任务完成后返回的类型 * */类MyAsyncTask AsyncTask<延伸;字符串,整数,Bitmap> {//执行异步任务(doInBackground)之前执行,并且在ui线程中执行 @Override 保护无效onPreExecute () {//TODO自动生成方法存根 super.onPreExecute (); 如果(形象!=null) { image.setVisibility (View.GONE); }//开始下载对话框进度条显示 progress.show (); progress.setProgress (0); } @Override 保护位图doInBackground(字符串…params) {//TODO自动生成方法存根//参数是一个可变长的数组在这里我们只传进来了一个url 字符串url=params [0]; 位图的位图=零; URLConnection连接; InputStream;//用于获取数据的输入流 ByteArrayOutputStream bos;//可以捕获内存缓冲区的数据,转换成字节数组。 int len; 浮动数=0,总;//计数为图片已经下载的大小总为总大小 尝试{//获取网络连接对象 连接=(URLConnection)新java.net.URL (url) .openConnection ();//获取当前页面的总长度 总=(int) connection.getContentLength ();//获取输入流 是=connection.getInputStream (); bos=new ByteArrayOutputStream (); byte [] data=https://www.yisu.com/zixun/new字节[1024]; 而((len=is.read(数据)!=1){ 数+=兰; bos.write(数据、0 len);//调用publishProgress公布进度,最后onProgressUpdate方法将被执行 publishProgress ((int)(数/总* 100));//为了显示出进度人为休眠0.5秒 thread . sleep (500); } 位图=BitmapFactory.decodeByteArray (bos.toByteArray (), 0, bos.toByteArray () . length); is.close (); bos.close (); }捕捉(MalformedURLException e) {//TODO自动生成的catch块 e.printStackTrace (); }捕捉(IOException e) {//TODO自动生成的catch块 e.printStackTrace (); }捕捉(InterruptedException e) {//TODO自动生成的catch块 e.printStackTrace (); } 返回位图; }//在ui线程中执行可以操作ui @Override 保护无效onPostExecute(位图的位图){ null null null null null null null null null null null null null null null null null null null null在Android应用中利用异步任务实现一个进度条下载功能