Android基础之AsyncTask详解,巨细哟

【Android 】零基础到飞升 | AsyncTask异步任务 3.7 AsyncTask异步任务 分类 Android 基础入门教程 本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称... 阅读详情
  1. 构建AsyncTask子类参数
    1. 因为他是一个抽象类所有继承他之后需要重写下面三个泛型参数
      • Params:启动任务时,输入参数的类型。
      • Progress:后台任务执行中返回进度值的类型
      • Result:后台执行任务完成后返回结果的类型
  2. 构建AsyncTask子类的回调方法
    • dolnBackground:必须重写,异步执行后台程序将要完成的任务。
    • onPreExecute:执行后台耗时操作前被调用,用户通常会做一些准备工作,如一些初始化的操作。
    • onPostExecute():当dolnBackground()完成后,系统会自动调用该方法,并将dolnBackground()方法的返回值传给该方法。顾名思义就是展示我们所处理完的一个结果。
    • onProgressUpdate():在dolnBackground()方法中调用publishProgress()方法更新任务就会触发该方法。
  3. 程序的调动顺序是:
    • onPreExecute——>dolnBackground——>onPostExecute(没有调用publishProgress ())
  4. 传递进度:在dolnBackground()中调用publishProgress()方法的时候,就可以将一个进度值作为一参数传给onProgressUpdate(),我们就可以在onProgressUpdate()中得到这个参数,从而应用于更新一个异步进程的完成进度。


实例:
  1. 下载图片,并且显示(只是下载到缓存中。程序kill后需要再次下载)
    • package com.example.administrator.android_asynctask;

      import android.app.Activity;
      import android.graphics.Bitmap;
      import android.graphics.BitmapFactory;
      import android.os.AsyncTask;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.widget.ImageView;
      import android.widget.ProgressBar;

      import java.io.BufferedInputStream;
      import java.io.ByteArrayOutputStream;
      import java.io.FilterInputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.net.HttpURLConnection;
      import java.net.URL;

      import java.net.URL;
      import java.net.URLConnection;

      /**
      * Created by Administrator on 2016/5/26.
      */
      public class ImageTestextends Activity {
      private ImageView imageView;
      private ProgressBar progressBar;
      private static String URL = "http://img4.duitang.com/uploads/item/201308/10/20130810135200_tyE55.jpeg";

      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.image);
      imageView = (ImageView) findViewById(R.id.imageView1);
      progressBar = (ProgressBar) findViewById(R.id.pb);
      new MyAsyncTask_1().execute(URL);
      }

      class MyAsyncTask_1 extends AsyncTask<String, Void, Bitmap> {
      @Override
      //在doInBackground启动前 ,显示progressBar
      protected void onPreExecute() {
      super.onPreExecute();
      progressBar.setVisibility(View.VISIBLE);
      }

      @Override
      protected void onPostExecute(Bitmap bitmap) {
      super.onPostExecute(bitmap);
      //隐藏progressBar
      progressBar.setVisibility(View.GONE);
      //传递bimap
      imageView.setImageBitmap(bitmap);
      Log.d("xyx","onPostExecute_bitmap=" + bitmap);
      }

      @Override
      //参数是可变长数组
      //<URL类型,进度值类型,返回值类型>
      //doInBackground方法是开启一个异步线程做耗时操作的
      protected Bitmap doInBackground(String... params) {
      //取出对应的URL
      String url = params[0];
      Bitmap bitmap = null;
      Log.d("xyx","url=" + url);
      //定义网络链接对象
      //以前的
      // URLConnection connection;
      HttpURLConnection connection;
      //用于获取的数据的输入流
      InputStream inputStream = null;
      try {
      //通过openConnection方法获取connection对象,获取网络连接对象
      Thread.sleep(3000);
      //原来方法
      // connection = new URL(url).openConnection();
      connection = (HttpURLConnection) new URL(url).openConnection();
      connection.setDoInput(true);
      connection.setRequestMethod("GET");
      connection.connect();
      //获取一个输入流
      inputStream = connection.getInputStream();
      BufferedInputStream bis = new BufferedInputStream(inputStream);
      //通过,decodeStream解析输入流流
      bitmap = BitmapFactory.decodeStream(bis);
      inputStream.close();
      bis.close();
      } catch (IOException e) {
      e.printStackTrace();
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      return bitmap;
      }
      }
      }
  2. 模拟进度条
    • package com.example.administrator.android_asynctask;

      import android.app.Activity;
      import android.content.Intent;
      import android.os.AsyncTask;
      import android.os.Bundle;
      import android.widget.ProgressBar;
      import android.widget.TextView;

      import java.util.List;

      /**
       * Created by Administrator on 2016/5/27.
       */
      public class progressBarTest extends Activity {
          private ProgressBar pb;
          private TextView tv;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.progress);
              pb= (ProgressBar) findViewById(R.id.pb2);
              new MyAsyncTask_ProgressBar().execute();
          }

          class MyAsyncTask_ProgressBar extends AsyncTask<Void, Integer, Void> {
              @Override
              protected Void doInBackground(Void... params) {
                  for (int i = 0; i <=100; i++) {
                      try {
                          Thread.sleep(300);
                          publishProgress(i);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
                  return null;
              }

              @Override
              protected void onProgressUpdate(Integer... values) {
                  super.onProgressUpdate(values);
                  pb.setProgress(values[0]);

              }
          }

      }
  3. 取消AsyncTask
    • AsyncTask机制:因为他的底层是线程池 ,所有多次开始——返回后,他会卡住只有等之前的Task全部完成后,才会开始新的Task,而且,我们doInBackground中用的是for循环,所以只有等for循环结束,才会去执行下一个Task;所以会造成,多次进入后,进度条就会卡住的BUG,如何解决呢?
    • 方案:
      • AsyncTask和Activaty的生命周期保持一致,也就是Activity生命周期走到onPause的时候,把AsyncTask干掉就好了。
    • package com.example.administrator.android_asynctask;
      
      import android.app.Activity;
      import android.content.Intent;
      import android.os.AsyncTask;
      import android.os.Bundle;
      import android.util.Log;
      import android.widget.ProgressBar;
      import android.widget.TextView;
      
      import java.util.List;
      
      /**
       * Created by Administrator on 2016/5/27.
       */
      public class progressBarTest extends Activity {
          private ProgressBar pb;
          private TextView tv;
          private MyAsyncTask MTP;
          MyAsyncTask_ProgressBar mb = new MyAsyncTask_ProgressBar();
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.progress);
              pb = (ProgressBar) findViewById(R.id.pb2);
              mb.execute();
          }
      
      
          protected void onPause() {
              super.onPause();
              if ((mb != null) && (mb.getStatus() == AsyncTask.Status.RUNNING)) {
                  //这只是把MTP标记为cancel状态,不是真正的取消了线程,那我就需要,
                  // 给doInBackground中的for循环设定判断条件,
                  // 并且给onProgressUpdate进行判断是否要更新
                  mb.cancel(true);
              }
          }
      
          class MyAsyncTask_ProgressBar extends AsyncTask<Void, Integer, Void> {
              @Override
              protected Void doInBackground(Void... params) {
                  for (int i = 0; i <= 100; i++) {
                      //是否有cancel状态
                      if (isCancelled()) {
                          break;
                      }
                      try {
                          Thread.sleep(300);
                          publishProgress(i);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
                  return null;
              }
      
              @Override
              protected void onProgressUpdate(Integer... values) {
                  super.onProgressUpdate(values);
                  if (isCancelled()) {
                      return;
                  }
                  pb.setProgress(values[0]);
      
              }
          }
      
      }
      

失败原因:
  1. 下载部分:
    • 内部类是要放在外部类里面的
    • 图片无法显示的原因:bitmap通过bitmap = BitmapFactory.decodeStream(bis);这方法无法获得bitmap值;
    • 解决办法,网址有问题,不是图片网址
    • 附带博客一个,解决其他问题:http://blog.youkuaiyun.com/andypan1314/article/details/6670320
     

总结:
  •  必须在UI线程中创建AsyncTask的实例
  • 必须在UI线程中调用AsyncTask的execute()方法
  • 重写的四个方法是系统自动调用的,不应手动调用
  • 每个AsyncTask只能被执行一次,多次调用将会引发异常
  • dolnBackground只有这方法是在其他线程的,其他方法都是在UI线程。
     
掌握Android开发:AsyncTask实例详解 异步任务(Asynchronous Task)是Android中一种特殊的抽象类,它设计用来处理在后台线程上运行的长时间运行的操作,并将结果更新到主线程。AsyncTask提供了一种简便的接口,使得不需要深入了解线程和Handler机制,也能完成异步操作。在Android开发中,异步任务(AsyncTask)是一个抽象的泛型类,它允许开发者执行后台操作并在操作完成时更新UI线程。AsyncTask简化了异步操作的实现,使得开发者不需要直接与线程和Handler打交道,从而降低了线程操作的复杂性。 阅读详情

相关推荐

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 409

详解Android中AsyncTask的使用

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。

LiuHe 39万+

elegant(ELEctron Generation ANd Tracking)入门指南(1)

elegant (ELEctron Generation ANd Tracking),美国先进光子源(APS)所用的圆环加速器的模拟程。

qq_41106132的博客 1845

Android学习——AsyncTask

AsyncTask 1.AsyncTask介绍 除了使用 Handler实现线程间的通信外, Android提供了一个工具类 :AsyncTask, 它使创建需要与用户界面交互的长时间运行的任务变得更简单。相对来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和Handler即可实现。AsyncTask是抽象类。AsyncTask定义了三种泛型类型Params, Progre...

UUUUUltraman的博客 243

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 422

二维紧束缚模型求解程序

假如我们已经推导出了二维紧束缚模型的哈密顿量矩阵H(kx,ky)的解析形式,那么在整个布里渊区对角化矩阵就可以得到能带。从技术上说这里面有以下几个问题。 1. 缺少实空间和倒空间的坐标,使得能带难以和布里渊区高对称点对应。 2. 最容易处理的布里渊区是矩形,对于其他多边形,如果全布里渊区mesh画费米面有一定技术困难。 因此一个好的处理框架是首先给出实空间原子坐标,给出实空间哈密顿量,...

wwxy1995的博客 4081

Android中AsyncTask(异步执行任务)的使用

AsyncTask(异步执行任务)很常用,在侧边菜单栏,下拉刷新中都有用到~~下面看一下介绍吧     在开发过程中经常会用到多线程,开启单独的线程来处理费时的操作,避免阻塞主线程(UI线程)。在子线程中通过Handler类,采用消息机制来更新主线程,和主UI线程进行通信。但是太多的子线程会给系统带来巨大的负担,随之带来一些性能问题。所以出现了AsyncTask。      Andro

kyrin(云中鹤) 1777

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 322

登录

1.登录代码import android.app.ProgressDialog;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.os.Message;import andro...

ydc0128的博客 556

一文让你轻松理解802.11ax RU的概念

RU

1042484520@qq.com(邮箱) 3363

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

为了兼容这部分手机,车机端在向手机端发送USB控制命令字的同时,需要启动mDNS Server,广播车机端IP地址和HiCar SDK侦听的Server Socket端口(IP地址和端口在HiCar SDK初始化USB driver时,告知车机),在检测到手机断开USB连接时关闭mDNS Server。厂商在集成HiCar SDK开发HMI应用时,不可避免会使用到智能座舱的敏感权限,例如位置权限、摄像头权限、麦克风权限等,SDK初始化时,厂商HMI应用需要设置必要的车机参数供SDK使用。

码农17年的博客 1075

40. 【Android教程】AsyncTask:异步任务

AsyncTask 类通常用来在执行后台任务的同时刷新 UI,通过调用execute()方法触发后台任务的执行,首先会回调 AsyncTask 的,接着回调来执行自定义的后台任务,最后回调。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 2212

[Dify实战] 项目复盘助手:自动拉数据、生成复盘报告

本文介绍如何利用Dify平台构建自动化项目复盘助手,解决传统人工复盘效率低、易遗漏等问题。系统通过自动拉取Git/Jira等数据源,计算关键指标后,由LLM生成结构化复盘报告。文章详细讲解了数据采集、指标计算、Prompt设计等核心模块的实现,并分享了完整Workflow搭建步骤。实践表明,该系统能将复盘耗时从4小时缩短至10分钟,显著提升数据准确率和执行频率。最后总结了数据一致性、输出质量等常见问题的解决方案,强调Dify+LLM组合可实现复盘流程的自动化流水线。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 117

Android AsyncTask 详解

将复杂工作异步化、线程化对于Android 的性能的提高起到了很重要的作用,Android 框架为开发提供了很多辅助程序,这一篇着重分析Android AsyncTask的原理。

私房菜 6810

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android AsyncTask详解

Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。   Android为了

1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android AsyncTask详解

(写在前面:文章是看了慕课上的教程之后写的,感谢http://www.imooc.com/learn/377) 一、AsyncTask基本结构介绍 首先,顾名思义,AsyncTask是异步任务。 为什么要异步任务? 因为只有UI线程,即主线程可以对控件进行更新操作。好处是保证UI稳定性,避免多线程对UI同时操作。 同时要把耗时任务放在非主线程中执行,否则会造成阻塞,抛出无响应异常

沈鸿斌的博客 4078

Android AsyncTask 深度解析

params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;onPreExecute()和onPostExecute()方法都执行在主线程,onProgressUpdate()能够更改UI(更改进度条进度)必然也是主线程。这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。doInBackground()方法执行在线程池某一线程中,(看过源码后得到的结果,通过Log可以知道该方法没有执行在主线程中)

2501_90389522的博客 1582

LangGPT 结构化提示词实战:用《诗人》角色提示词教会 ChatGPT 创作现代诗、七言律诗与五言诗

本文以 LangGPT 仓库中的经典示例 [《诗人》提示词](https://link.gitcode.com/i/26df194a42e27afed1484a4d251688d5) 为骨架,逐段拆解其 `Role / Profile / Skills / Rules / Workflow / Initialization` 六段式结构,并结合同目录下的 [ChatGPT 完整对话实录](http

gitblog_01117的博客 826

Android基础之AsyncTask

背景AsyncTask是Android中异步请求的基础类。由于在Android系统是单线程模型,即只能在主线程更新UI。之所以这样设计,主要是为了避免多个线程对UI同时操作造成的混乱。另一方面,Android是一个多线程的操作系统,我们不可能把所有操作都放在主线程中操作,如网络请求,读取存储的数据,等等。否则会抛出ANR异常。所以,有必要把耗时操作放在非UI线程中执行,而仅在UI线程更新UI。

vanpersie_9987的博客 476

【Android 开发】: AsyncTask 详解

在Androidy应用开发中,整个架构的性能好坏很大一部分都体现在线程的操作中,所以这是Android开发中是一块很重要的内容,对于线程,多线程这一部分的基础内容,我们可以参考本博客前期中Java多线程的内容:JavaSE第九十七讲:线程与进程 在这一讲中我们主要学习Android中关于AsyncTask的学习以及相关Demo的实现。

AHuier_Techblog :如果我不在写代码,你就 @me 5987

Android中AsyncTask使用详解

在Android中我们可以通过Thread+Handler实现多线程通信,一种经典的使用场景是:在新线程中进行耗时操作,当任务完成后通过Handler向主线程发送Message,这样主线程的Handler在收到该Message之后就可以进行更新UI的操作。上述场景中需要分别在Thread和Handler中编写代码逻辑,为了使得代码更加统一,我们可以使用AsyncTask类。AsyncTask是And

孙群 5万+

Android中的AsyncTask和接口回调使用详解

Android中的AsyncTask和接口回调使用详解我的主页 Demo下载地址一、AsyncTask简单介绍 官方文档中队AsyncTask的解释是:AsyncTask更加适用于UI线程。这个类允许执行后台操作并在UI界面上发布结果,而不必处理多线程。AsyncTask是围绕Thread和Handler设计的一个辅助类,它不构成一个通用的线程框架。Asynctasks应该用于短作业(最多几秒钟)

Pinger的博客 6980

安卓AsyncTask

参考:https://www.jianshu.com/p/ee1342fcf5e7 AsyncTask挺好用,能解决一大堆问题。 下面是总结的使用步骤: 1自定义类继承AsyncTask,里面分别传入三个参数,传入的参数、进度类型、返回的结果类型 2重写继承的相关方法,在相关方法中执行耗时操作和更新ui处理结果的操作 下面是转载的: 前言 多线程的应用在...

博客 572

Android中AsyncTask的使用详解

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。

人生起落,生活苦甜,坚持追求! 1287
下一篇: Android_Handler的使用,巨细,慎入
guideit
博客等级 码龄12年 1粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值