`
mixer_a
  • 浏览: 369314 次
社区版块
存档分类
最新评论

Android进阶2之AsyncTask实现异步处理任务

 
阅读更多

<一>AsyncTask实现异步处理任务

在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则: 
1. 不要阻塞UI线程 
2. 确保只在UI线程中访问Android UI工具包 
    当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。 
   比如说从网上获取一个网页,在一个TextView中将其源代码显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得页面源码后,是不能直接在网络操作线程中调用TextView.setText().因为其他线程中是不能直接访问主UI线程成员 


<二>Android提供了一些其他线程中访问UI线程的方法
Activity.runOnUiThread( Runnable ) 
View.post( Runnable ) 
View.postDelayed( Runnable, long ) 
Hanlder 
但是这些类或方法都有一些问题。会使你的代码很复杂很难理解。实现一些很复杂的操作并需要频繁地更新UI时这会变得更糟糕。 
为了解决这个问题,Android 提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单。不需要借助线程和Handler即可实现。 

<三>AsyncTask操作步骤

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 

<1> 子类化AsyncTask 

AsyncTask是抽象类 ,我们必须自己写一个类来继承AsyncTask 类

<2>实现AsyncTask中定义的下面方法 (很关键)

onPreExecute()                                  该方法将在执行实际的后台操作前被UI thread调用。这个方法只是做一些准备工作,如在界面上显示一个进度条。 

doInBackground(Params...),              将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。 

publishProgress                                 该方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。 

 onProgressUpdate(Progress...),        publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,可以通过一个进度条进行展示。 

onPostExecute(Result),                     doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread. 

<四>AsyncTask遵守准则

为了正确的使用AsyncTask类,以下是几条必须遵守的准则: 
<1>Task的实例必须在UI thread中创建 
<2>execute方法必须在UI thread中调用 
<3>不要手动的调用onPreExecute(), onPostExecute(Result)doInBackground(Params...), onProgressUpdate(Progress...)这几个方法 
<4> task只能被执行一次,否则多次调用时将会出现异常

<五>AsyncTask的泛型

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

不是所有类型都总是被异步任务使用。如果标记哪个参数不用,只是用void代替就可以了。

<六>取消异步任务

只要调用 cancel(boolean)方法,一个异步任务可以随时取消。调用这个方法会导致后来的调用isCancelled()返回true。

确保任务被取消尽可能快,你应该总是定期从doInBackground(Object[])中检查isCancelled()返回值。




具体实现:

注意:添加网络权限:

mian.xml



分享到:
评论

相关推荐

    Android进阶知识点一

    7. **异步处理**:Android应用的主线程负责UI更新,因此需要使用AsyncTask、Handler、Thread、Runnable或者现代的Coroutines进行后台任务处理,避免阻塞UI线程。 8. **通知与BroadcastReceiver**:通知是向用户传达...

    Android高手进阶教程

    Android的多线程处理和异步编程是性能优化的关键。使用Handler、Looper、AsyncTask以及现代的LiveData和Coroutines,可以避免主线程阻塞,提高用户体验。同时,理解内存管理和资源回收对于防止内存泄漏和提高应用...

    Android 进阶之光.7z

    3. **多线程与异步处理**:在Android开发中,处理耗时操作的正确方式是使用线程和异步任务。书会涵盖Handler、Looper、AsyncTask以及线程池等概念,帮助开发者实现高效、流畅的用户体验。 4. **内存管理与性能优化*...

    Android高手进阶指南

    《Android高手进阶指南》是一本专为已经具备一定Android基础的开发者准备的深度学习资料。这本书涵盖了Android开发中的高级主题和技术,旨在帮助读者提升在Android领域的专业技能,成为真正的技术专家。 首先,本书...

    Android异步加载文字

    在Android开发中,异步加载是一项至关重要的技术,主要用于解决UI线程阻塞问题,提升应用性能和用户体验。...同时,这也是Android应用开发进阶过程中不可或缺的一部分,为处理更复杂的异步任务和网络请求奠定了基础。

    Android异步任务完整实例

    在Android开发中,异步任务(AsyncTask)是一种常见的处理耗时操作的方式,它允许开发者在后台线程中执行任务,同时保持与UI线程的交互。本实例提供了完整的AsyncTask实现,对于初学者和进阶开发者来说,都是一个极...

    《Android高级进阶》

    1. **多线程与异步处理**:在Android应用中,为了保证UI的流畅性,开发者需要学会使用线程和异步操作来处理耗时任务。这包括Handler、Looper、Message机制,以及AsyncTask和IntentService的使用。 2. **内存管理与...

    Android开发进阶从小工到专家(pdf书签版)

    在核心开发技术方面,本书会深入探讨Android的异步编程模型,包括AsyncTask、Handler、Looper和线程池。此外,还会有对IntentService、JobScheduler等后台任务执行策略的解析,帮助开发者优化应用性能并节省系统资源...

    Android开发进阶 从小工到专家.PDF

    - AsyncTask:简化异步任务的处理方式。 - Java 8的新特性:如CompletableFuture等高级并发工具。 5. **跨进程通信**: - Intent:不仅用于启动Activity和服务,还可以实现不同进程间的通信。 - AIDL (Android ...

    Android开发进阶:从小工到专家

    6. **多线程和AsyncTask**:Android应用中的异步处理是提升性能的关键,掌握线程管理和AsyncTask的使用,能有效防止ANR(Application Not Responding)问题,优化用户体验。 7. **碎片化(Fragment)**:随着大屏...

    Android高级进阶学习下载

    5. **多线程与异步处理**:Android中的AsyncTask、Handler、Thread、Runnable、IntentService等都是处理异步操作的方式,理解和运用它们能避免UI线程阻塞,提升用户体验。 6. **内存管理**:理解Dalvik/ART虚拟机的...

    Android高手进阶教程pdf

    随着协程(Coroutines)的引入,学习如何在Android中优雅地处理异步任务也是必不可少的。 除此之外,还有关于权限管理、Android应用的调试与测试、性能优化、内存泄漏检测、插件化技术、热修复、组件化开发等高级...

    《Android研发工程师高级进阶》

    2. **多线程与并发**:理解Android中的线程模型,如Handler、Looper、ThreadPool,以及如何使用AsyncTask、IntentService等进行异步处理。还要掌握Java并发包下的概念,如Semaphore、CountDownLatch、CyclicBarrier...

    android_UI进阶之实现listview的下拉加载

    这部分内容通常涉及Android的事件处理机制,以及可能的异步加载数据操作,如使用AsyncTask来异步从网络或本地获取数据。 实现下拉刷新的库和示例代码在网上也有许多,如上述提及的国外开发者Johan Nilsson的实现,...

    android高级进阶

    1. **多线程与异步处理**:Android应用中,为了保证UI的流畅性,需要将耗时操作放在后台线程执行。教程可能会介绍Handler、Looper、AsyncTask、IntentService以及现代的JobScheduler、WorkManager等多线程解决方案。...

    android高手进阶教程

    2. **网络通信**:Android应用常常需要与服务器进行数据交换,本教程会深入解析AsyncTask、IntentService、Retrofit、OkHttp等网络通信工具的使用,以及如何处理异步操作和网络状态变化。 3. **数据存储**:在...

    android开发进阶从小工到专家 ,何红辉著.pdf

    2. **多线程与异步编程**:理解Handler机制、AsyncTask类的用法以及Service组件的生命周期管理。 3. **自定义View**:学习绘制自定义控件的方法,掌握Canvas绘图上下文的使用,以及Path、Paint等类的功能介绍。 ###...

    Android开发进阶从小工到专家(书签版)

    《Android开发进阶从小工到专家》是由资深Android开发者何红辉编著的一本专业书籍,旨在帮助初入Android开发领域的工程师逐步提升技能,直至达到专家级别。这本书以清晰的结构和高清的书签版形式呈现,使得学习过程...

Global site tag (gtag.js) - Google Analytics