AsyncTask与Thread+Handler的区别、AsyncTask的使用

Android中AsyncTask的使用心得 AsyncTask是什么?            AsyncTask是Android提供的异步封装工具,它可以实现异步请求和主界面更新的操作,它的本质其实是线程池+Handler的封装,   AsyncTask的使用场景?   AsyncTask和Thread+handler的区别是什么?         AsyncTask其本质是线程池+Handler的封装,而Thread+han... 阅读详情

AsyncTask实例

Android应用中,经常会执行耗时操作,耗时操作过程中,UI经常需要更新,通常在主线程中启动子线程来更新UI,所以就出现了Thread+Handler机制,Thread通过handler向主线程发送消息、传递数据,来更新UI,但是大量的子线程会分享主线程的系统资源,从而会使主线程因资源受限而导致应用性能降低,更好的方法是使用AsyncTask,关于AsyncTask与Thread+Handler的区别,本人比较同意下面摘自网络的一段话:

Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新 UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0  SDK时其实官方将其命名为UserTask,其内部是 jdk 1.5开始新增的concurrent库,做过 j2ee的网友可能明白并发库效率和强大性,比 Java原始的Thread更灵活和强大,但对于轻量级的使用更为占用系统资源。Thread是Java早期为实现多线程而设计的,比较简单不支持concurrent中很多特性在同步和线程池类中需要自己去实现很多的东西,对于分布式应用来说更需要自己写调度代码,而为了Android UI的刷新 google引入了Handler和Looper机制,它们均基于消息实现,有事可能消息队列阻塞或其他原因无法准确的使用。 Android开发网推荐大家使用AsyncTask代替Thread+Handler的方式,不仅调用上更为简单,经过实测更可靠一些,Google在Browser中大量使用了异步任务作为处理耗时的I/O操作,比如下载文件、读写数据库等等,它们在本质上都离不开消息,但是 AsyncTask相比Thread加Handler更为可靠,更易于维护,但AsyncTask缺点也是有的比如一旦线程开启即 dobackground方法执行后无法给线程发送消息,仅能通过预先设置好的标记来控制逻辑,当然可以通过线程的挂起等待标志位的改变来通讯,对于某些应用Thread和Handler以及Looper可能更灵活。
 
这段话,基本阐述清除了AsyncTask的实现和Thread的区别。
再来具体的认识AsyncTask中的一些方法:

       * AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
   * Params 启动任务执行的输入参数,比如HTTP请求的URL。
   * Progress 后台任务执行的百分比。
    * Result 后台执行任务最终返回的结果,比如String,Integer等。

       * AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。

   * 1) 继承AsyncTask
    * 2) 实现AsyncTask中定义的下面一个或几个方法
       * onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
       * doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
      * onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
      * onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.

      * onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。

为了正确的使用AsyncTask类,以下是几条必须遵守的准则:

      1) Task的实例必须在UI 线程中创建

      2) execute方法必须在UI 线程中调用

      3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。

      4) 该task只能被执行一次,否则多次调用时将会出现异常

      doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。

   
 
关于AsyncTask的使用,下面将写一个小实例:
 
功能描述:
 
    使用AsyncTask来下载一个文件
 
首先先建立一个web项目,并且放上一个文件(SqliteDev),如图:
           

然后建立一个Android项目,并且定义一个Activity和一个AsyncTask实例:

      

package com.app.testplatform;

import util.AsycTaskClass;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskTest extends Activity {
private ProgressBar downPress;
private TextView downLable;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.view_asynctask);
  downPress=(ProgressBar) this.findViewById(R.id.pb_downProgress);
  downLable=(TextView)this.findViewById(R.id.tv_downLable);
  this.findViewById(R.id.btn_downAction).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
      String downUrl="http://192.168.168.189/web_test/SqliteDev.zip";
      AsycTaskClass task=new AsycTaskClass(downPress,downLable,downUrl);
      task.execute(null);
    }
  });
  }
}

    AsycTaskClass类的代码:
 

package util;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;

import android.os.AsyncTask;
import android.webkit.URLUtil;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsycTaskClass extends AsyncTask<String, Integer, String> {
private ProgressBar downPress;
private String url;
private TextView tv;
public AsycTaskClass(ProgressBar pb,TextView tv,String url) {
downPress=pb;
this.url=url;
this.tv=tv;
}

@Override
protected void onPreExecute() {
tv.setText("下载中..");
System.out.println("onPreExecute");
}

protected void onProgressUpdate(Integer[] values) {
downPress.setProgress(values[0]);
System.out.println("onProgressUpdate ");
};

protected void onPostExecute(String result) {
System.out.println("onPostExecute "+result);
tv.setText("下载结束...");
};

@Override
protected void onCancelled() {
System.out.println("onCancelled ");
}

@Override
protected String doInBackground(String... params) {
try {
//tv.setText("开始中...");//多次 启动下载task时 此处会报错
HttpURLConnection c=(HttpURLConnection) (new URL(url)).openConnection();
InputStream ips=c.getInputStream();
int max=c.getContentLength();
byte[] bt=new byte[1024];
int len=-1;
int downLen=0;
while((len=ips.read(bt))!=-1)
{
downLen+=len;
int baiF=(downLen*100/max);
publishProgress(baiF);
}

ips.close();
c.disconnect();


} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "execute end ";
}

}

      AsyncTaskTest   的布局文件有:
  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <ProgressBar android:id="@+id/pb_downProgress" android:layout_gravity="center_horizontal" android:layout_width="200px" android:layout_height="10px" style="?  android:attr/progressBarStyleHorizontal" android:max="100"/>
  <TextView android:id="@+id/tv_downLable" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"             android:text="下载提示" />
  <Button android:id="@+id/btn_downAction" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"       android:text="下载提示" />
</LinearLayout>

 

效果图如下:

WPAsyncTask.zip WP Async Task 是 TechCrunch 推出的 WordPress 的异步任务插件,该插件用于  TechCrunch.com 网站。 示例代码: <?php class JPB_Async_Task extends WP_Async_Task {     protected $action = 'save_post';     /**      * Prepare data for the asynchronous request      *      * @throws Exception If for any reason the request should not happen      *      * @param array $data An array of data sent to the hook      *      * @return array      */     protected function prepare_data( $data ) {}     /**      * Run the async task action      */     protected function run_action( $data ) {} } 立即下载

相关推荐

rv1106 模型部署

ONNX(Open Neural Network Exchange),开放神经网络交换,是一种模型IR,用于在各种深度学习训练和推理框架转换的一个中间表示格式,支持多种深度学习框架,包括 TensorFlow、PyTorch、Caffe 等。将模型转换为 ONNX 格式后,可以更容易地在不同的深度学习框架中进行部署和推理,而无需重新训练模型。

weixin_50993868的博客 1287

Android中的异步:Handler+Thread 跟AsyncTask 两种方式的区别

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

Crystal_xing的专栏 2087

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

Android中的Handler和AsyncTask的区别

问题的由来最近老看见有人问Android中的Thread与AsyncTask的区别,因此研究了一下,总结如下。 第一,如果真心想弄清楚这两个的具体用法,最好的方法是把Message、MessageQueue、Looper、Handler、HandlerThread和AsyncTask这六个类的源代码全部看懂。 第二,如果觉得困难,那么就来看看我的这篇总结文章吧。Handler类,可以理解为消息/

LogicTeamLeader的专栏 1万+

ROS机器人全覆盖路径规划实战:6种ipa算法对比与选型指南(附避坑经验)

本文深入对比了ROS中ipa_coverage_planning功能包集成的6种全覆盖路径规划算法,包括牛耕分解、栅格旅行商、神经网络、局部能量最小、轮廓线和凸感知放置。文章从覆盖率、重复率、计算效率、动态避障等核心工程指标出发,提供了基于不同场景(如静态/动态环境、规则/复杂布局)的实战选型指南,并分享了神经网络和局部能量最小等关键算法的参数调优与避坑经验,旨在帮助开发者根据实际需求选择并优化最合适的ipa覆盖算法。

perl8的博客 364

SOLIDWORKS转CAD字体终极选择:TrueType vs SHX,哪个才是你图纸协作的“安全牌”?

本文深入探讨SOLIDWORKS转CAD工程图中的字体选择问题,对比TrueType与SHX字体在DWG文件协作中的表现。通过真实案例揭示字体映射的兼容性陷阱,提供企业级字体管理方案,帮助工程师规避版本差异、系统依赖和法律风险,确保图纸协作的稳定性。

weixin_34233974的博客 266

Android之Handler与AsyncTask的那些事

AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l  简单,快捷 l  过程可控         使用的缺点: l

way 2943

LightTools中VBA宏的编写入门

LightTools和VBA联动

bestgamer的博客 2348

android asynctask handler 区别,AsyncTask与Thread+Handler简要分析

!个人研究探索整理异步处理目的:提高程序响应性体现:耗时操作网络数据(图片)加载数据库查询复杂业务逻辑处理开发中涉及UI的操作必须遵守单线程模型的原则,因为Android的UI操作并非线程安全,并且这些操作必须在UI线程中执行。单线程模型的两条法则:1. 不要阻塞UI线程2. 确保只在UI线程中访问Android UI工具包几种其他线程访问主线程的方法[代码]java代码:12345671.Act...

weixin_39798943的博客 313

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

eDP V1.4协议介绍

eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要求;AUX通道电路设计不同(相对DP取消了AC耦合电容和100KΩ/1MΩ的上下拉电阻):典型应用场景;

qflook的博客 4303

Android实战技巧:深入解析AsyncTask

AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复。 AsyncTask引发的一个问题 上周遇到了一个极其诡异的问题,一个小功能从网络上下载一个图片,然后放到ImageView中,是用AsyncTask来实现的,本身逻辑也很简单,仅是在doInBackground中用HTTP请求把图

稀有猿诉 10万+

vue2 - 详细实现播放AMR格式音频并实现自定义播放器样式,支持amr音频文件在线地址URL播放、调用服务端API接口获取二进制文件流amr形式、用户本地上传amr文件并实现立即播放(详细代码)

vue2,amr,amr文件播放,vue播放amr音频文件以及在线url跨域问题解决,vue使用audio标签播放amr音频,amr跨域解决,amr网页解码播放,文件上传后怎么播放,vue2播放.amr语音文件,api接口形式调用获取的amr如何播放,vue中如何使用audio元素播放AMR格式的文件,进度条,vue前端如何播放AMR格式的音频文件,vue播放语音文件AMR格式,播放amr格式音频AMR录音机,h5原生audio播放amr格式的音频,VUE2使用benz-amr-recorder 实现解码、

✅ 精选推荐文章 7415

AsyncTask对比Thread加Handler

很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的conc

意者行风Android之旅 963

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

AsyncTask和Thread加Handler的区别

Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是jdk 1.5开始新增的concurrent库,

本人很懒 633

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

AsyncTask VS Thread+Handler

很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里 Taodoor给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将其命名为UserTask,其内部是JDK 1.5开始新增的concurre

Zicheng's tech blog 676

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AsyncTask和Thread+Handler对比

AsyncTask对比Thread加Handler     很多网友可能发现Android平台很多应用使用的都是AsyncTask,而并非Thread和Handler去更新UI,这里Android123给大家说下他们到底有什么区别,我们平时应该使用哪种解决方案。从Android 1.5开始系统将AsyncTask引入到android.os包中,过去在很早1.1和1.0 SDK时其实官方将

三杯五岳 638

关于AsyncTask与Handler

AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点:  简单,快捷  过程可控 使用的缺点:  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

lrx之成长记录 808

AsyncTask 使用详解

一. AsyncTask 是什么 AsyncTask是Android提供的执行异步操作的类,它通过对Thread和Handler进行封装,可以让我们在后台线程中执行耗时操作,然后将结果发送给UI主线程,从而在主线程中进行UI更新等操作。 二. 为什么要引入 AsyncTask 其实在 Android 中我们经常通过 Thread + Handler实现多线程通信,Handler实现异步任...

Luckcat 644

Android异步任务(AsyncTask)的设计思想

AsyncTask都经常,但你了解它的设计目的和思想吗,知道它是如何实现的吗,你好奇吗?

登高而望远 1462

android 多线程Thread,Runnable,Handler,AsyncTask等之间的关系

android 的多线程实际上就是java的多线程。android的UI线程又称为主线程。 我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。

NEWCOGE100的博客 645

Handler 和 AsyncTask 的比较

众所周知,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。

whyalwaysmea 1125

详解Android中AsyncTask的使用

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

weixin_30295091的博客 83

android 主线程 与 handler,Android中的Handler和AsyncTask的区别

问题的由来最近老看见有人问Android中的Thread与AsyncTask的区别,因此研究了一下,总结如下。第一,如果真心想弄清楚这两个的具体用法,最好的方法是把Message、MessageQueue、Looper、Handler、HandlerThread和AsyncTask这六个类的源代码全部看懂。第二,如果觉得困难,那么就来看看我的这篇总结文章吧。Handler类,可以理解为消息/任务处...

weixin_39519798的博客 240
上一篇: 《打造极致二维码扫描系列》 -- ZXing开发详解
下一篇: 详解 Android 的 Activity 组件
codepython
博客等级 码龄20年 125粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值