Android-AnsyncTask异步任务的使用
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。关于Handler的相关知识,前面也有所介绍,不清楚的朋友们可以参照一下。
为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
同步和异步的概念区别:
同步,必须执行完成某个问题后才能继续执行其他的。
异步,我会去先执行其他问题,你执行完之后返回给我一个结果就可以。
android中为什么要引用异步任务呢
android启动的,会启动一个线程也称为主线程,UI线程,但是我们不能把所有耗时的任务交给主线程来完成,这样会影响用户的体验,也就是说我们要另外的开辟新的线程来执行我们的任务,
但是在android中,(加载图片,网络编程都属于耗时的操作),在android4.0后规定禁止在主线程中完成网络操作,所以说这些耗时的任务要交给子线程,
问题,子线程中是不能进行ui操作的,只有作为主线程的ui线程才能够进行ui操作,那么我们怎么讲信息返回给用户呢。
方式1.我们可以通过handler,在handler中写好了跟新的操作,在子线程中调用sendmessage通知我们的handler跟新ui
方式2.利用Activity.runonUIThread(Runnable)进行子线程到ui线程的切换。
为什么要是用AsyncTask?
很简单,人都是很懒的,使用上述的两种方式操作麻烦,所以大佬们就封装了一个异步执行的方法,便于我们直接处理耗时逻辑,更新UI.
我们一般用它完成网络操作,图片加载,数据传输等操作。(当然后续我们会选择我们的第三方的框架来完成)
Asynctask的基本使用:
首先它是一个抽象类,也就是说我们要重写他的方法然后在new
AsyncTask<Params,progress,result>
parames:启动任务的时候执行的参数,比如传入的url
Progress:后台执行进度的百分比单位
result:执行完异步操作后返回的结果
(与handler相比,他的后台是一个线程池,再数据庞大的时候回体现出优势)
AsyncTask的几个重要的方法
@Override protected void onPreExecute() { super.onPreExecute(); } //执行耗时操作之前调用的一个方法,相当于我们的初始化的方法
注意该该方法是运行在ui线程中的
@Override protected String doInBackground(String... params) { return null; }
该方负责执行我们耗时的业务逻辑操作,也就是说他是在子线程中运行的,如果想要更新ui怎么办
调用的我们的publicProgress方法可以更新我们的ui, 此方法是在子线程中运行的
publishProgress(Object o);
此方法表示更新我们的进度,可用于更新下载的进度条等。
@Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); }
此方法是在主线程中执行的方法,一旦我们在耗时逻辑代码中调用了publicProgress就表示我们希望更新进度条。
此时就会调用这个方法到ui线程跟新我们的进度条。
注意:task实例必须在ui线程中创建 task.excute(初始参数比如url);
我们无需手动的调用task中的方法
task只能被执行一次
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Android 异步获取网络图片并处理导致内存溢出问题解决方法
测试环境为Adnroid 2.1以上. 1.AndroidManifest.xml 权限配置: 添加互联网访问权限: 复制代码 代码如下: <uses-permission android:name="android.permission.INTERNET" /> 2.异步图片类 ImageDownloadTask 复制代码 代码如下: import java.io.ByteArrayOutputStream; import java.io.IOException; imp
-
Android中BroadcastReceiver(异步接收广播Intent)的使用
Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高. 用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroadcast()或者Context.sendStickyBr
-
android异步任务设计思详解(AsyncTask)
这里说有设计思想是我根据查看Android源代码提炼出来的代码逻辑,所以不会跟Google工程师的原始设计思想100%符合(也有可能是0%),但是本文一定可以帮助你理解AsyncTask,也可能有一些你以前没有发现的内容. 大家都知道,Android的主线程(又叫UI线程,线程ID为1)有一些限制策略,使得主线程有些事做不了,比如访问网络就不允许,否则就是报,但在2.3之后的版本,你可以通过添加以下代码更改其限制策略,从而强制使得主线程可以访问网络: 复制代码 代码如下: if (android
-
android异步请求服务器数据示例
1.在android4.0以后的版本,主线程(UI线程)不在支持网络请求,原因大概是影响主线程,速度太慢,容易卡机,所以需要开启新的线程请求数据: 复制代码 代码如下: thread1 = new Thread(){@Overridepublic void run() { try { URL url = new URL(WebUrlManager.CARSEVER_GetCarsServlet); HttpURLConnection conn = (HttpURLConnectio
-
Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而Ima
-
Android多线程及异步处理问题详细探讨
1.问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2.问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到"很卡". eg:你点击按钮下载一首歌,接着该按钮一直处于按下状态,那么用户体验就很差. 2)多线程实现方式implements Runnable 或 extends Thread 3)多线程核心机制是Handler 4)提供如下几种实现方式 --1-–Handler ----------
-
android开发教程之handle实现多线程和异步处理
这次浅谈一下Handler,为什么会出现Handler这个功能特性呢?首先,在之前的基本控件,基本都是在Activity的onCreate(Bundle savedInstanceState)方法中调用和处理的,但是,在有些情况,比如在网络上下载软件等一些需要等待响应时间比较长的操作,如果同样放在Activity的该方法中的话,那么在执行该方法的时候,整个Activity是不可动的,用户只能干等着,这样的用户体验是十分差的,这种处理方式带来的最好结果是等待了一段时间后,得到了想要的结果,不好的情
-
Android 异步加载图片分析总结
研究了android从网络上异步加载图像,现总结如下: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new 一个Handler对象,加载图像方法如下所示 复制代码 代码如下: private void loadImage(final String url, final int id) { handler.post(new Runnable() { public void run() { Drawable
-
android异步加载图片并缓存到本地实现方法
在android项目中访问网络图片是非常普遍性的事情,如果我们每次请求都要访问网络来获取图片,会非常耗费流量,而且图片占用内存空间也比较大,图片过多且不释放的话很容易造成内存溢出.针对上面遇到的两个问题,首先耗费流量我们可以将图片第一次加载上面缓存到本地,以后如果本地有就直接从本地加载.图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片. 首先看一下异步加载缓存本地代码: 复制代码 代码如下: public
-
Android AsyncTack 异步任务实例详解
Android AsyncTack 异步任务 这里写一个小实例,来学习巩固Android AsyncTack 异步任务的知识,以便在项目中使用. 介绍一下如何使用 1, 继承AsyncTask public class MyTask extends AsyncTask<Params, Progrss, Result> 我们来说一下这三个泛型的作用: Params: 调用异步任务时传入的类型 ; Progress : 字面意思上说是进度条, 实际上就是动态的由子线程向主线程publish数据的类
-
Android ListView异步加载图片方法详解
本文实例讲述了Android ListView异步加载图片方法.分享给大家供大家参考,具体如下: 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getView方法后就会异步的在过去某个时间内用han
-
Android的异步任务AsyncTask详解
AsyncTask,顾名思义,异步任务.说到异步,最简单的理解就是不同步.再复杂一点理解,就得举例子了. 假设我要去火车站买票,刚到火车站我突然发现我忘了带身份证.怎么办?怎么办! 想办法,想办法!我想我应该找个在学校的同学帮我送过来,因为我不能自己回去拿啊,还要排队呢,走不开.嗯,要找人送过来.但是问题来了,我找人送身份证了,我去排队了,如果排到第一位了身份证还没到怎么办?叮,脑袋上面突然亮了一个小灯泡,机智的我在排队前想到了两种方案: 第一种方案,让售票员等着我,我后面队伍里买票的人也等着我
-
Android中异步类AsyncTask用法总结
本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉 这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介: AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦 AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Pa
-
Android同步异步任务与多线程及Handler消息处理机制基础详细讲解
目录 一.同步与异步 Android中的多线程 Android中的多线程与主线程与子线程 Handler异步通信系统 使用新线程计算质数 一.同步与异步 同步的执行任务:在执行程序时,如果没有收到执行结果,就一直等,不继续往下执行,直到收到执行结果,才接着往下执行. 异步的执行任务:在执行程序时,如果遇到需要等待的任务,就另外开辟一个子线程去执行它,自己继续往下执行其他程序.子线程有结果时,会将结果发送给主线程 Android中的多线程 线程:通俗点讲就是一个执行过程.多线程自然就是多个执行过程
-
Android RxJava异步数据处理库使用详解
目录 观察者模式 操作符 创建Observable 转换Observable 过滤Observable 组合Observable 错误处理 Schedulers调度器-解决多线程问题 管理RxJava的生命周期 RxJava与Retrofit完成网络请求 观察者模式 四大要素:Observable(被观察者),Observer (观察者),subscribe (订阅),事件. 观察者订阅被观察者,一旦被观察者发出事件,观察者就可以接收到. 扩展的观察者模式 当事件完成时会回调onComplete
-
详解android进行异步更新UI的四种方式
大家都知道由于性能要求,Android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正: 使用Handler消息传递机制: 使用AsyncTask异步任务: 使用runOnUiThread(action)方法: 使用Handler的post(Runnabel r)方法: 下面分别使用四种方式来更新一个TextView. 1.使用Handler消息传递机制 package com.example.runonuithreadtest; import andr
-
Android图片异步加载框架Android-Universal-Image-Loader
Android-Universal-Image-Loader是一个图片异步加载,缓存和显示的框架.这个框架已经被很多开发者所使用,是最常用的几个Android开源项目之一,主流的应用,随便反编译几个,都可以见到它的身影.淘宝,天猫,Facebook,京东商城等都用到了这个项目. 该项目的Github地址链接 运行流程: 每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示.如果需要的图片缓存在本地,它会开启一个独立的线程队列.如果在缓存中没有正确的图
-
android在异步任务中关闭Cursor的代码方法
查询数据会比较耗时,所以我们想把查询数据放在一个异步任务中,查询结果获得Cursor,然后在onPostExecute (Cursor result)方法中设置Adapter,我们可能会想到使用Activity的managedQuery来生成Cursor,这样Cursor就会与Acitivity的生命周期一致了,多么完美的解决方法!然而事实上managedQuery也有很大的局限性,managedQuery生成的Cursor必须确保不会被替换,因为可能很多程序事实上查询条件都是不确定的,因此我们
-
Android实现异步加载图片
麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的. 今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片都是使用了AsynTask这个API,继续这个类,实现起来非常简单也很方便.在doInBackground()方法里实现下载逻辑.具体实现如下 实现逻辑是:先从内存中读取,如果内存中有这张图片,则直接使用;如果内存没有再到sdcard上读取,如果有则显示;如
随机推荐
- Ajax获取响应内容长度的方法
- Javascript类型系统之String字符串类型详解
- 详解SpringMVC学习系列之国际化
- python二分法实现实例
- js弹出层永远居中实现思路及代码
- 深入浅析Android坐标系统
- vue高德地图之玩转周边
- MySql表、字段、库的字符集修改及查看方法
- 理解MySQL存储过程和函数
- Android编程实现通话录音功能的方法
- 不错的JS中变量相关的细节分析
- php实现登录tplink WR882N获取IP和重启的方法
- AJAX请求类
- mysql免安装版配置步骤详解分享
- jQuery 使用手册(三)
- Javascript学习笔记-详解in运算符
- Java后端Tomcat实现WebSocket实例教程
- JavaScript基本语法讲解
- JavaScript易错知识点整理
- linux下安装nodejs的详细步骤