Android专题之AsyncTask(一)基本概念介绍

文章目录

一、相关文章

二、前言

三、简单介绍

1、什么是线程的阻塞?

2、如何去处理用户的阻塞呢?

3、什么是异步操作呢?我们如何才能实现异步操作呢?

四、详细介绍

1、为什么需要使用异步任务?

2、那么到底什么是线程阻塞?

3、AsyncTask的起源?

点击源码下载:01_AsyncTask_演示线程阻塞


一、相关文章

Android专题之AsyncTask(一)基本概念介绍

Android专题之AsyncTask(二)简单AsyncTask例子解决线程阻塞

Android专题之AsyncTask(三)异步方法操作之进度条

二、前言

虽然网易博客要关了,之前一直很闹心给我迁移失败等等各种问题!现在想想自己手动迁移到CSDN也不尽然都是坏事,起码可以把以前写的博客过一遍,还可以查漏补缺进行博客的完善,孔子有言:“温故而知新”,好了闲话少说步入正题。准备迁移的是《Android专题之AsyncTask》,本专题总共有七讲,下面附上网易博客截图:

三、简单介绍

1、什么是线程的阻塞?

线程的阻塞会影响到用户的一些体验,程序用着突然没有响应了。android系统提示用户,是要关闭这个程序,还是等待...... 等等

例如: 线程阻塞时间过长,出现的提示ANR

2、如何去处理用户的阻塞呢?

就需要使用异步操作。什么是异步操作呢? 

3、什么是异步操作呢?我们如何才能实现异步操作呢?

什么是异步操作呢? 两块任务,同时进行,相互之间并不进行干扰。把比较消耗时间的操作,放在另外一个线程中去执行。这样就形成了两个线程,独立运行的状态,互不影响。

怎么做? android体系当中给我们提供了AsyncTask类,我们需要继承AsyncTask类,熟悉AsyncTask的基本使用方法

四、详细介绍

1、为什么需要使用异步任务?

AsyncTask即异步任务,是Android给我们提供的一个处理异步任务的类。通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。

我们知道,Android中只有UI线程,也就是主线程才能进行对UI的更新操作,而其他线程是不能直接操作UI的。这样的好处是保证了UI的稳定性和准确性,避免多个线程同时对UI进行操作而造成UI的混乱。

但Android是一个多线程的操作系统,我们总不能把所有的任务都放在主线程中进行实现。比如网络操作、文件读取等耗时操作,如果全部放到主线程去执行,就可能会造成后面任务的阻塞。

Android会去检测这种阻塞,当阻塞时间太长的时候,就会抛出Application Not Responsed(ANR)错误,所以我们需要将这些耗时操作放在非主线程中去执行,这样既避免了Android的单线程模型,又避免了ANR。

2、那么到底什么是线程阻塞?

在java中,内置是支持线程的,因为java是面向对象的语言,所以在java里面,线程也是一个对象。新创建的线程就是一个线程对象,调用start方法之后,或者说经过一系列操作以后,新线程会进入就绪状态。

就绪状态什么意思呢? CPU同一时刻,只能执行一个线程,所以进入就绪状态。它就等待CPU,给它分配时间,轮到这个线程,就可以开始运行了。当给线程分配时间,线程就开始运行,线程中的代码运行完,线程就死亡了。但是在运行的过程中,可能会产生一些事件。这些事件可能会导致正在运行的程序,暂停了 或 停止不再运行了。那么这个事件,就会导致线程阻塞。等这个事件,结束以后,又进入就绪状态,又可以执行了。

事例1:

一个人走在马路上,走着走着,你遇到红灯了,这个红灯就是一个事件。这个事件,导致你停下来了,这个时候就处于阻塞状态。过一会儿,这个红灯变为绿灯,那么,阻塞的事件消失,你就又可以往下运行了,这就是线程的阻塞。

事例2:

其实线程的休眠,就属于线程的一种阻塞事件。也有可能是网络上的文件比较大,下载需要很长时间

注:看到图片才想起,当时这块知识点有参考mars的视频,记得看的时候是13年左右还挺火的,在此感谢mars的分享!

3、AsyncTask的起源?

提到异步任务,我们能想到用线程、线程池去实现。确实Android给我们提供了主线程与其他线程通讯的机制。

但同时Android也给我们提供了一个封装好的组件AsyncTask。利用AsyncTask,我们可以很方便的实现异步任务处理,AsyncTask可以在子线程中更新UI,也封装简化了异步操作。

使用线程、线程池处理异步任务涉及到了线程的同步、管理等问题。而且当线程结束的时候还需要使用Handler去通知主线程来更新UI。而AsyncTask封装了这一切,使得我们可以很方便的在子线程中更新UI。

最后整理一个Demo分享给大家,欢迎大家留言讨论支持!

点击源码下载:01_AsyncTask_演示线程阻塞

演示效果如下图,点击“开始网络操作”开始睡眠,连续多次点击“打印一个字符串”没有反应的!睡眠结束后再同时输出打印。。。

下一篇我们将写一个demo解决此问题:Android专题之AsyncTask(二)简单AsyncTask例子解决线程阻塞

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值