·AsyncTask是一个轻量级的异步抽象类

·Android程序刚启动时,会同时启动一个像一个的主线程,这个主线程主要负责处理与UI有关的事件,有时也被称为UI线程,Android app中必须遵循单线程模型原则:Android UI操作并不是线程安全的并且这些操作都要在ui线程中进行假如我们在非UI线程中,比如在主线程中new Thread()另外开辟一个线程,然后直接在里面修改UI控件的值; 此时会抛出下述异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 另外,还有一点,如果我们把耗时的操作都放在UI线程中的话,如果UI线程超过5s没有响应用于请求,那么 这个时候会引发ANR(Application Not Responding)异常,就是应用无响应~ 最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作~不然会报: android.os.NetworkOnMainThreadException

·相关参数:

AsyncTask<Params,Progress,Result>

Params:启动任务执行的输入参数

Progress:后台任务的百分比

Result:后台任务执行的结果,String,Integer等

·相关方法与流程:

execute(Param):在主线程中手动调用触发异步线程任务

onPreExrcute():执行后台耗时操作前调用,通常用于初始化操作,比如进度条的显示。

doInBackground(Param):在onPreExecute后立即执行,负责执行后台耗时操作,可调用publishProgress(Progress)更新任务进度。

onPostExecute(Result):在doInBackground执行完成后,onPostExecute方法将被ui线程调用,后台计算结果通过该方法传递到ui线程展示给用户。

OnProgressUpdate(Progress):在publishProgress方法被调用后,ui线程调用此方法在界面上展示任务进度情况。

onCnacelled():用户取消线程时调用。

·在Activity或Fragment中使用AsyncTask时,最好在Activity或Fragment的onDestory()调用cancel(boolean);

·  当Activity重新创建时(屏幕旋转 / Activity被意外销毁时后恢复),之前运行的AsyncTask(非静态的内部类)持有的之前Activity引用已无效,故复写的onPostExecute()将不生效,即无法更新UI操作

使用建议
在Activity恢复时的对应方法 重启 任务线程

·  若AsyncTask被声明为Activity的非静态内部类,当Activity需销毁时,会因AsyncTask保留对Activity的引用 而导致Activity无法被回收,最终引起内存泄露

使用建议
AsyncTask应被声明为Activity的静态内部类

代码示例:

 package com.deep.myapplication5.AsyncTask;

 import androidx.appcompat.app.AppCompatActivity;

 import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar; import com.example.myapplication5.R; import static java.lang.Thread.sleep; public class AsyncTaskActivity extends AppCompatActivity {
private Button button;
private ProgressBar progressBar;
private boolean sentence=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
button=findViewById(R.id.async_btn);
progressBar=findViewById(R.id.async_progress);
final mAsyncTask mAsyncTask1 = new mAsyncTask();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (sentence){
mAsyncTask1.execute();
sentence=false;
}
else{
mAsyncTask1.cancel(true); sentence=true;
}
}
});
} public class mAsyncTask extends AsyncTask<String,Integer,String>{ @Override
protected void onPreExecute() {
super.onPreExecute();
button.setText("正在加载···");
} @Override
protected String doInBackground(String... strings) {
int count=0;
while (count<100){
count++;
publishProgress(count);
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
} @Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
button.setText("已加载"+values[0]+"%");
} @Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
button.setText("加载完毕!");
} @Override
protected void onCancelled() {
super.onCancelled();
button.setText("已取消!");
progressBar.setProgress(0);
}
} }

参考:https://www.jianshu.com/p/ee1342fcf5e7

  https://www.runoob.com/w3cnote/android-tutorial-ansynctask.html

Android_AsyncTask异步类的更多相关文章

  1. Android_AsyncTask异步任务(一)

    AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI ...

  2. Android_AsyncTask异步任务机制

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  3. Android中异步类AsyncTask的理解

    这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介:AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦  ...

  4. AsyncTask 轻量级的异步类

    初步:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html 详细:http://blog.csdn.net/liuhe68 ...

  5. AsyncTask异步类的简单操作

    package com.example.day9; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; im ...

  6. 异步处理工具类:AsyncTask

    (一) AsyncTask,是android提供的轻量级的异步类.可以直接继承AsyncTask,在类中实现异步操作,可以通过接口实现UI进度更新,最后反馈执行的结果给UI主线程 .之所以有Handl ...

  7. 异步 Apex 类

    异步Apex类 一个Apex类可以定义为异步类,用于异步执行. 异步类可以通过多种方式实现: Future注解 批处理 Queueable接口 Schedulable接口 Future注解 使用Fut ...

  8. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  9. Android异步任务机制之AsycTask

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. 本篇就说说AsyncTask的异步实现. 1.什么时候使用 AsnyncTask 在上一篇文章已经说了,主线程主要负 ...

随机推荐

  1. BeautifulSoup入门

    BeautifulSoup库入门 BeautifulSoup库的理解 BeautifulSoup库是解析.遍历.维护”标签树”的功能库 示例代码: from bs4 import BeautifulS ...

  2. ASP.NET Core使用环境变量

    前言 通常在应用程序开发到正式上线,在这个过程中我们会分为多个阶段,通常会有 开发.测试.以及正式环境等.每个环境的参数配置我们会使用不同的参数,因此呢,在ASP.NET Core中就提供了相关的环境 ...

  3. ubuntu16.04 自建源

    来自于https://www.cnblogs.com/liangqihui/p/7150066.html APT本地源的搭建(可用于局域网apt-get源搭建或者本地源) 本文档介绍使用apt-mir ...

  4. 当前行的td值传入模态框

    <!-- 让include引用的页面,因为故障列表和周.月故障列表里面的table和分页是一样的前端页面,只有一点不同,没必要每个页面都写这些 --> <table id=" ...

  5. 分区格式化大于2 TiB磁盘

    如果您要分区格式化一块大于2 TiB的作数据盘用的云盘(本文统一称为 大容量数据盘,小于2 TiB的数据盘统称为 小容量数据盘),您必须采用GPT分区形式.本文档描述了如何在不同的操作系统里分区格式化 ...

  6. Python常用库 - os库

    os简单介绍 os 模块提供了非常丰富的方法用来处理文件和目录 os关于目录路径的方法 # 获取当前路径 path = os.getcwd() # 获取当前绝对路径 os.path.abspath(p ...

  7. 用原生JS&PHP简单的AJAX实例

    功能介绍: 1)file.html 使用 xmlhttp 请求服务器端文件 text ,并更新 file.html 的部分内容 2)update.html 使用 xmlhttp 通过 filewrit ...

  8. [MongoDB]评估使用mongodb的五个因素

    企业选择 NOSQL 或非表格结构数据库,评估时应从以下五个关键维度来考虑:• 数据模型的类型• 查询模型是否能满足灵活的查询需求• 事务模型类型,以及一致性属于强一致性还是最终一致性• APIs 的 ...

  9. iOS闪退日志的收集和解析

    在开发过程中往往会遇见有个别用户或者测试人员反馈app的闪退现象,而项目一般集成的统计闪退的第三方库是笼统的统计了所有的闪退信息,无法去定位某一个用户提出的某一个时间点的某一个闪退问题,于是乎这个时候 ...

  10. .Net框架的模块代码生成器--其二(dotnet tool)

    以下是个人工作场景,继上篇后,还剩下第3步骤没有解决 3.(这个可能我们公司才有)每个模型还要在每一层那里创建一个文件,这个模型的增删改查逻辑就在这里写 这个我是自己写一个.Net Core命令行工具 ...