为什么要用异步任务?

在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" ><Buttonandroid:id="@+id/btn_download"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="点击下载" /><FrameLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent" ><ImageViewandroid: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";@Overrideprotected 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);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew MyAsyncTask().execute(URL);}/** String*********相应我们的URL类型* Integer********进度条的进度值* BitMap*********异步任务完毕后返回的类型  * */class MyAsyncTask extends AsyncTask<String, Integer, Bitmap>{//运行异步任务(doInBackground)之前运行。而且在ui线程中运行@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();if(image!=null){image.setVisibility(View.GONE);}//開始下载 对话框进度条显示progress.show();progress.setProgress(0);}@Overrideprotected 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,0,len);//调用publishProgress发布进度,最后onProgressUpdate方法将被运行publishProgress((int)(count/total*100));//为了显示出进度 人为休眠0.5秒Thread.sleep(500);}bitmap=BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.toByteArray().length);is.close();bos.close();} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}return bitmap;}//在ui线程中运行 能够操作ui@Overrideprotected void onPostExecute(Bitmap bitmap) {// TODO Auto-generated method stubsuper.onPostExecute(bitmap);//下载完毕 对话框进度条隐藏progress.cancel();image.setImageBitmap(bitmap);image.setVisibility(View.VISIBLE);}/** 在doInBackground方法中已经调用publishProgress方法 更新任务的运行进度后* 调用这种方法 实现进度条的更新* */@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);progress.setProgress(values[0]);}}
}

最后不要忘记在AndroidManifest文件里配置网络訪问权限

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

转载于:https://www.cnblogs.com/jzssuanfa/p/7102221.html

android:异步任务asyncTask介绍及异步任务下载图片(带进度条)相关推荐

  1. Android中通过SeekBar手动控制ProgressBar与模拟下载自动更新进度条

    场景 进度条的常用场景: 通过SeekBar拖动进而更新ProgressBar进度条,比如调整音量效果等. 模拟下载实现自动更新进度条. 注: 博客: https://blog.csdn.net/ba ...

  2. Android 自定义 View:包含多种状态的下载用圆形进度条

    前言 最近做项目碰到一个这样的一个需求:需要一个环形的进度条表示一个下载请求的进度加载. 同时要以各种不同的图标展现其下载过程中的各个状态:等待.下载中.暂停.错误.完成. 具体状态对应图标见下图: ...

  3. 如何异步下载图片显示进度条

    本文案例中,使用原生协程结合requests库,而requests库本身不支持异步请求方式.但可以使用协程对象将requests库包装,运用协程executor对象使其requests库支持异步请求. ...

  4. android 上传图片进度条,Android带进度条的文件上传示例(使用AsyncTask异步任务)...

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. d ...

  5. php 异步进度条,PHP学习:PHP+Ajax异步带进度条上传文件实例

    <PHP学习:PHP+Ajax异步带进度条上传文件实例>要点: 本文介绍了PHP学习:PHP+Ajax异步带进度条上传文件实例,希望对您有用.如果有疑问,可以联系我们. PHP应用前端引入 ...

  6. android解压zip文件进度条,Android实现文件解压带进度条功能

    解压的工具类 package com.example.videodemo.zip; public class ZipProgressUtil { /*** * 解压通用方法 * * @param zi ...

  7. Android更新带进度条的通知栏

    在网上查询了下,Android版本号更新通知栏带进度条,醉了,基本都是复制过来.有的代码不全,连源代码下载都没有,有下载也须要积分.还不能用.真黑心啊!! 之前自己也写过自己定义通知栏Notifica ...

  8. Android开发之带进度条的WebView

    老套路先看效果: 直接上代码: 区分java和kotlin版本 Java版本: package com.example.progresswebview;import android.os.Bundle ...

  9. android自定义带进度条的圆形图片

    前言:在项目听新闻的改版中需要实现环绕圆形新闻图片的进度条功能,作为技术预备工作我就去看了一些网上的相关的原理,做了一个自定义带进度条的圆形图片的demo,并将这个实现写成文章发布出来,谁需要了可以进 ...

  10. android第三方开源音频播放器,Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用...

     Android第三方开源SeekBarCompat:音乐类播放器等APP进度条常用 Android平台原生的SeekBar设计简单,然而,比如现在流行的一些音乐播放器的播放进度控制条,如果直接使 ...

最新文章

  1. 系列文章|OKR与敏捷(二):实现全栈敏捷 1
  2. 中小企业信息化--网页设计模拟题1
  3. Sharepoint中遭遇The Path specified cannot be used at this time.
  4. Thymeleaf select 使用 和多select 级联选择
  5. hdc mfc 画扇形图_MFC画图总结-DIB图形绘制
  6. python教程2017百度云_python下载ICCV2017全套paper
  7. 发现 nios2-elf-gcc 一处 bug
  8. cookie和session笔记
  9. 解析ES6箭头函数中的this
  10. 2022年CISP考试题库下载
  11. 最大子列和问题(C语言)
  12. RabbitMQ(七)延迟队列
  13. win10如何安装.NET3.5
  14. 龙ol服务器维护补偿boss,BOSS也疯狂《龙OL》野外BOSS大搜罗
  15. 监控文件变化 (Python—看门狗)
  16. Python学习笔记 print()函数输出多个变量 使用.format()
  17. c语言怎么打出花边图案,甄嬛舌尖各种版本苏牙咬人 连黄梅戏C语言都来了
  18. CSP 序列查询新解 202112-2
  19. minGW下载与编译器安装
  20. 2021年危险化学品经营单位安全管理人员考试题库及危险化学品经营单位安全管理人员模拟考试题

热门文章

  1. 最大团问题和最大独立子集
  2. kubernetes视频教程笔记 (17)-Job和CronJob
  3. vue学习-处理边界-依赖注入
  4. java基础知识体系
  5. 小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_44、新日志框架LogBack介绍...
  6. 学习python菜鸟教程
  7. IntelliJ IDEA设置不自动打开最后关闭的项目
  8. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)
  9. swift 笔记 (二十一) —— 高级运算符
  10. 二分法和牛顿迭代实现开根号函数:OC的实现