·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. Jmeter之下载文件

    前言 我们可以利用postman工具来测试下载文件的接口,那么假如要利用Jmeter工具来进行下载接口的测试,又该如何测试呢? 下载文件的接口地址:/pinter/file/api/download? ...

  2. javascript 防止多次提交或执行(在规定时间段内只允许执行一次) 默认 3000ms

    "use strict" class Func{ constructor(){} isRun(id, time){//防止多次提交或执行(在规定时间段内只允许执行一次) 默认 30 ...

  3. 02_TypeScript数据类型

    typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验,写ts代码必须指定类型.   1.布尔类型(boolean) var flag:boolean = true;   2.数字 ...

  4. STM32F407的时钟配置

    有3种时钟, HSI,High Speed Internal,默认是这个 HSE,High Speed External,用外置晶振,官方开发板默认晶振为25MHz,stm32f4xx.h中有定义HS ...

  5. ELK logstash 各种报错

    1.logstash 启动后数据传输了,但是 ElasticSearch 中没有生成索引,查看logstash日志,报错如下 [2018-06-08T14:46:25,387][WARN ] [log ...

  6. Nginx + Linux 性能调优

    Nginx以高性能负载均衡.缓存和web服务器出名,支撑着世界上繁忙网站中的40%.大多数使用场景下,Nginx和Linux系统的默认配置表现较好,但是仍有必要做一些调优以期达到最佳性能. 这篇文章讨 ...

  7. sed知识及常用用法梳理

    1.sed命令简介及其参数说明 sed流编辑器,擅长对文本进行增删改查,过滤指定的字符串和取指定行,也可以在行中字符串前后插入内容,功能非常强大. 注意:sed默认只支持基本的正则表达式,如果要想支持 ...

  8. idea springboot 使用JRebel热部署

    1.首先在idea中下载jrebel.由于已经下载过了.上这样 2.下载jrebel破解插件 https://gitee.com/gsls200808/JrebelLicenseServerforJa ...

  9. 解决intellij idea新建maven项目,加载archetype慢的问题

    File->settings   在VM Options内输入 -DarchetypeCatalog=internal 重启idea

  10. weblogic非正常关闭,<BEA-141281>错误

    在域下 find -name *.lok , 全删除: 在域下 find -name *.DAT,全删除: 然后就可以正常启动了