Android——AsyncTask
AsyncTask简单介绍
我们首先需要明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。
AsyncTask是一个抽象类,我们在使用时需要定义一个它的派生类并重写相关方法。如下:
public abstract class AsyncTask<Params, Progress, Result>
AsyncTask还是一个泛型类
Params 启动任务执行的输入参数,比如HTTP请求的URL。 doInBackground
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
使用AsyncTask 的一个异步加载数据最少要重写以下这两个方法:
onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作
doInBackground(Params... params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法)
onProgressUpdate(Progress... values)//由publishProgress内部调用,表示任务进度更新
onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果
onCancelled() //此方法会在后台任务被取消时被调用
例子:使用AsyncTask模拟下载图片
Xml:
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/notify_info"
android:textSize="18sp"
android:text="提示内容" />
<Button
android:layout_width="206dp"
android:layout_height="wrap_content"
android:id="@+id/dL"
android:text="下载图片"/>
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
...
mainActivity.class
package com.example.asynctask_download_demo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView info;
private ProgressBar pb;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
info = (TextView) findViewById(R.id.notify_info);
pb= (ProgressBar) findViewById(R.id.progressBar);
button= (Button) findViewById(R.id.dL);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressBarAsyncTask progressBarAsyncTask = new ProgressBarAsyncTask(info,pb);
progressBarAsyncTask.execute(1000);
}
});
}
}
ProgressBarAsyncTask.class
package com.example.asynctask_download_demo;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;
public class ProgressBarAsyncTask extends AsyncTask<Integer,Integer,String> {
private TextView textView;
private ProgressBar progressBar;
public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar;
}
@Override
protected String doInBackground(Integer... params) {
NetOperator netOperator = new NetOperator();
int i=0;
for ( i=0;i<100;i++){
netOperator.operator();
publishProgress(i);
}
return i+params[0].intValue()+"";
}
@Override
protected void onPreExecute() {
textView.setText("开始执行异步线程");
}
@Override
protected void onPostExecute(String s) {
textView.setText("异步操作执行结束"+s);
}
@Override
protected void onProgressUpdate(Integer... values) {
int value = values[0];
progressBar.setProgress(value);
}
}
NetOperator.class
//模拟网络环境
public class NetOperator {
public void operator(){
try {
//休眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Android——AsyncTask的更多相关文章
- android AsyncTask介绍(转)
android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接 ...
- Android AsyncTask异步加载WebAPI
之前做的程序一直存在很多问题,因为需要加载的Activity需要从网络加载数据.并没有完全正确的使用异步的方法去加载! 之前用的虽然是AsyncTask,但是在加载完成的时候还是并没有使用AsyncT ...
- Android -- AsyncTask 使用和缺陷
一.AsyncTask的基本用法 由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它.在继承时我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下: ...
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- android AsyncTask介绍
AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主 ...
- Android AsyncTask分析
---恢复内容开始--- 因为android的UI线程是不安全的,如果你UI线程里执行一些耗时任务,很容易就导致程序崩溃.并且目前网络任务也不能够在UI线程里执行.处理这些问题除了直接写一个线程以外, ...
- Android AsyncTask异步任务(二)
之前我们讲过了AsyncTask 的生命周期(onPreExecute-->doInBackground-->onProgressUpdate-->onPostExecute),今天 ...
- Android --AsyncTask异步任务(一)
1.为什么要异步任务 Android单线程模式 耗时操作放在非主线程(UI线程)中执行 我们都知道Android是单线程模式,只有主线程才能对UI操作,简称UI线程.当然这样的好处是:保证UI的稳定性 ...
- Android AsyncTask 简单用法
简介 AsyncTask 是一个轻量级的异步处理类.使用是需继承自该类.可以方便的执行异步任务并且在将进度显示在UI上. 注意事项 AsyncTask只适合处理轻量级的任务即耗时几秒或者几十秒的任务. ...
- Android AsyncTask 源码解析
1. 官方介绍 public abstract class AsyncTask extends Object java.lang.Object ↳ android.os.AsyncTask&l ...
随机推荐
- (3)Python字符串
- 构建企业 YUM仓库
构建企业 YUM仓库 本地光盘提供基础软件包Base yum缓存提供update软件包 yum缓存提供常用软件包: nginx, zabbix, docker, saltstack 环境准备 系统 I ...
- 【vue】vue +element 搭建项目,vue-cli 如何打包上线
以自己的项目为例 第一步:手动修改config文件夹中的index.js文件中的build对象,将 assetsPublicPath 中的 “/” ,改为 “你实际的加载路径” 如图: 第二步:执行( ...
- 【angularJS】过滤器
1.分类: <1>内置过滤器(见4) <2>自定义过滤器 2.作用:接收一个输入,通过某个规则进行处理,然后返回处理后的结果 3.应用: <1>在模板中使用 用法 ...
- PHP 3 运算符 if...else...elseif 语句
<?php $x=10; $y=6; echo ($x + $y); // 输出 16 echo ($x - $y); // 输出 4 echo ($x * $y); // 输出 60 echo ...
- GitHub 优秀的 Android 开源项目 (精品)
1原文地址为 http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea Android开源项目系列汇总已完成,包 ...
- # 20175329 2018-2019-2 《Java程序设计》第二周学习总结
# 学号 2018-2019-3<Java程序设计>第三周学习总结 ## 教材学习内容总结 第二三章与我们所学习的C语言有很多的相似点,在这里我想主要就以我所学习的效果来讨论一下JAVA与 ...
- face recognition[翻译][深度人脸识别:综述]
这里翻译下<Deep face recognition: a survey v4>. 1 引言 由于它的非侵入性和自然特征,人脸识别已经成为身份识别中重要的生物认证技术,也已经应用到许多领 ...
- @vue/cli 3 运行支持报错 socket
问题 /sockjs-node/info 无限报错 解决方案 原因是相关代理端不支持 ws,因此需要在代理处关闭 ws,即 ws: false,如下: vue.config.js const ds_p ...
- Autofac踩坑经历
背景 接口框架使用反射,动态生成Controller,使用Autofac进行依赖注入,并替换默认DependencyResolver及IControllerFactory,Controller实例化代 ...