首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Art of Android Development Reading Notes 11

AsyncTask封装了线程池和Handler,它主要是为了方便开发者在子线程中更新UI。HandlerThread一种具有消息循环线程,在它内部可以使用Handler。...1.AsyncTask必须在主线程中加载,这个过程在Android 4.1及以上版本中已经被系统自动完成。...2.AsyncTask对象必须在主线程中创建,execute方法必须在UI线程调用。 3.一个AsyncTask对象只能执行一次,即只能调用一次execute方法,否则会报运行时异常。...带来并发错误AsyncTask又采用一个线程来串行执行任务。...HandlerThreadrun方法一个无限循环,因此当明确不需要再使用HandlerThread时候,可以通过它quit或者quitSafely方法来终止线程执行。

37920

关于Android中工作者线程思考

Android中,我们或多或少使用了工作者线程,比如Thread,AsyncTask,HandlerThread,甚至自己创建线程池,使用工作者线程我们可以将耗时操作从主线程中移走。...AsyncTask AsyncTaskAndroid框架提供给开发者一个辅助类,使用该类我们可以轻松处理异步线程与主线程交互,由于其便捷性,在Android工程中,AsyncTask被广泛使用。...AsyncTask与内存泄露 内存泄露Android开发中常见问题,只要开发者稍有不慎就有可能导致程序产生内存泄露,严重甚至可能导致OOM(OutOfMemory,即内存溢出错误)。...当我调用cancel(false),不打断正在执行任务,对应结果 处于doInBackground中任务不受影响,继续执行 任务结束不会去调用onPostExecute方法,而是执行onCancelled...以一个四核手机为例,当我们持续调用AsyncTask任务过程中 在AsyncTask线程数量小于CORE_POOL_SIZE(5个),会启动新线程处理任务,不重用之前空闲线程 当数量超过CORE_POOL_SIZE

73820
您找到你想要的搜索结果了吗?
是的
没有找到

浅谈Android 线程线程使用

2、AsyncTask 在具体使用过程中一些限制条件 AsyncTask 必须在主线程中加载; AsyncTask 对象必须在 UI 线程中创建; 不要在程序中直接调用 onPreExecute...在 Android 1.6之前,AsyncTask 串行执行任务Android 1.6时候 AsyncTask 开始采用线程池处理并行任务,但是从 Android 3.0开始为了避免 AsyncTask...所带来并发错误AsyncTask 又采用一个线程来串行执行任务。...由于 HandlerThread run 方法一个无限循环,因此当明确不需要在使用 HandlerThread ,可以通过它 quit 或者 quitSafely 方法来终止线程执行。...5、IntentService IntentService 一种特殊 Service,继承了 Service 并且一个抽象类,必须创建它子类才能使用 IntentService。

1.2K20

2016级移动应用开发在线测试11-线程

()当需要在Android程序中运行比较耗时操作,如网络请求,大文件I/O等,为了不阻塞主线程(UI线程),需要使用线程 3. ...()Android应用程序消息处理机制服务于线程,每个线程都可以有自己消息队列和消息循环。 4. ...下面关于AsyncTask类描述错误() http://android.xsoftlab.net/reference/android/os/AsyncTask.html 您回答为: 可以手动调用...(Progress...)这四个方法 ()使用AsyncTask进行多线程编程,需要继承AsyncTask类,必须重写dolnBackground方法,该方法后台执行方法,比较耗时操作都要放在这里...()AsyncTask实例必须在UI线程中创建,即在主线程中创建;execute(Params...)方法必须在UI线程调用;AyncTask方法只能被执行一次,若多次调用将会抛出异常 8.

68510

Android线程-----AsyncTask详解

当我们通过某个组件来启动另一个组件时候,这个时候默认都是在同一个线程当中完成。当然,我们可以自己来管理我们Android应用线程,我们可以根据我们自己需要来给应用程序创建额外线程。...然而,某些时候当我应用程序需要完成一个耗时操作时候,例如访问网络或者对数据库进行查询,此时我们UI Thread就会被阻塞。...原因,我们如果要做一个异步任务,我们必须要为其开辟一个新Thread,让其完成一些操作,而在完成这个异步任务,我可能并不需要弹出要给ProgressDialog,我并不需要随时更新我ProgressDialog...2.在使用AsyncTask做异步任务时候必须要遵循原则: AsyncTask必须在UI Thread当中加载,在Android Jelly_Bean版本后这些都是自动完成 AsyncTask对象必须在... AsyncTask 以及,我们在使用 AsyncTask 必须遵循规则。

52930

Android AsyncTask与handler

本文主要讲解下AsyncTask使用以及Handler应用 首先,我们得明确下一个概念,什么UI线程。顾名思义,ui线程就是管理着用户界面的那个线程!...我们在单线程模式下编程一定要注意:不要阻塞ui线程、确保只在ui线程中访问ui组件 当我们要执行一个复杂耗时算法并且最终要将计算结果反映到ui上,我们会发现,我们根本没办法同时保证上面的两点要求;我们肯定会想到开启一个新线程...可以调用 publishProgress方法来更新实时任务进度。该方法抽象方法,子类必须实现。...为了正确使用AsyncTask类,以下几条必须遵守准则: 1) Task实例必须在UI thread中创建 2) execute方法必须在UI thread中调用 3) 不要手动调用onPreExecute...* 如果想使用线程这里不能使用默认构造方法

73230

小知识 安卓线程和ui

2.2 让自己线程开始接收消息 其它线程默认Looper和MessageQueue没有准备好,可以在run方法里通过以下几步配置好: 调用Looper.prepare()方法,这会建立Looper...相比启动一个线程去达到计时器目的,使用非ui线程去执行耗时操作等就划算得多了。一般套路: 界面上需要新数据,启动一个线程去从网络或本地获取一批数据,通常是分页获得一个合理数据集合。...应该在ui线程中创建AsyncTask实例,并调用其execute方法。...api要求AsyncTask创建和execute方法调用必须在ui线程中执行,实际上重点execute方法,它里面调用了onPreExecute()方法,此方法会涉及ui操作,而且没有使用handler...sHandler类级别的,它结合AsyncTaskResult完成了在UI线程调用指定AsyncTaskupdateProgress和postExecute: AsyncTaskResult result

1.1K100

笔记16 | 解析和练习AsyncTask

前言 本节给大家带来Android给我们提供一个轻量级用于处理异步任务类:AsyncTask,我们一般 继承AsyncTask,然后在类中实现异步操作,然后将异步执行进度,反馈给UI主线程...2)同步与异步概念: 同步:当我们执行某个功能,在没有得到结果之前,这个调用就不能返回!...;还是上面那个后台下载例子,后台下载, 我们执行下载功能后,我们就无需去关心它下载过程,当下载完毕后通知我们就可以了~ 3) Android为很么要引入异步任务 因为Android程序刚启动,会同时启动一个对应线程...有时我们也把他称作UI线程!而在Android App我们必须遵守这个单线程模型规则: Android UI操作并不是线程安全并且这些操作都需要在UI线程中执行!...数据传输等,AsyncTask暂时可以满足初学者需求,谢谢小应用,但是到了公司真正做项目以后,我们更多使用第三发框架,比如Volley,OkHttp,android-async-http,XUtils

55960

AsyncTask? AsyncTask串行and并行?

3 AsyncTask使用注意事项 AsyncTask类第一次加载必须在主线程中加载(这个不需要我们关系,ActivityThread已经帮我们做了); AsyncTask对象创建代码必须在主线程调用...实例只能调用一次execute方法; AsyncTask执行execute方法Android1.6之前串行;Android1.6之后并行;Android3.0后串行。...4 以日常使用为起点分析AsyncTask源码 OK,假设你使用AsyncTask都是使用execute方法来调用,那么我们就从他入手吧! 我们进入execute方法体看下,里面做了什么呢?...当我调用Execute时候就会在mTasks队列中插入一个runnable实例,也就是说,mTasks里面存放线程,可能你会很奇怪,首先这里public synchronized void execute...小结: 通过上面代码,我们知道,在执行AsyncTaskexecute方法,我们线程默认放入一个ArrayQueue队列中串行执行

96620

Android基础总结(7)——异步消息处理

1、线程基本用法   Android线程编程其实并不比Java多线程特殊,基本都是使用相同语法。...Looper:每个线程汇总MessageQueue管家,调用Looperloop()方法之后,就会进入一个无限循环之中,然后每当MessageQueue中存在一条消息,就会将其取出,并传递到Handler...AsyncTask基本使用方法,首先AsyncTask一个抽象类,我们要使用它就必须要创建一个AsyncTask子类去继承它。...在使用时候,有几点需要格外注意: 异步任务实例必须在UI线程中创建。 execute(Params... params)方法必须在UI线程调用。...我们可以看到关键几个步骤方法都在其中,doInBackground(Params... params)一个抽象方法,我们继承AsyncTask必须覆写此方法;onPreExecute()、onProgressUpdate

75650

Android线程:这是一份全面&详细Synchronized学习指南

Android线程AsyncTask使用教程(含实例讲解) Android线程AsyncTask原理及源码分析 Android线程:HandlerThread使用教程(含实例讲解)...作用 保证同一刻最多只有1个线程执行 被Synchronized修饰方法 / 代码 其他线程 必须等待当前线程执行完该方法 / 代码块后才能执行该方法 / 代码块 3....应用场景 保证线程安全,解决多线程并发同步问题(实现阻塞型并发),具体场景如下: 修饰 实例方法 / 代码块,(同步)保护同一个对象方法调用 & 当前实例对象 修饰 静态方法 / 代码块...、恢复线程开销 但,若迟迟得不到更新,死循环对CPU资源也是一种浪费 7.2.4 具体实现方式 使用CAS有个“先检查后执行”操作 而这种操作在Java中典型不安全操作,所以 CAS在实际中由...多线程AsyncTask原理及源码分析 Android线程:HandlerThread使用教程(含实例讲解) Android线程:HandlerThread原理及源码分析 Android

91621

AsyncTask 相关问题

使用AsyncTask规则 AsyncTask 必须在 UI 线程加载(从 4.1 开始系统会帮我们自动完成)。AsyncTask 对象必须在 UI 线程创建。...execute 方法必须在 UI 线程调用。...在 1.6 之前,AsyncTask 串行执行任务,1.6 时候 AsyncTask 开始采用线程池里处理并行任务,但是从 3.0 开始,为了避免 AsyncTask 所带来并发错误AsyncTask...由于这个限制存在,当使用默认线程,如果线程数超过线程最大容量,线程池就会爆掉(3.0 后默认串行执行,不会出现个问题)。...AsyncTask并行还是串行 在 Android1.6 之前版本,AsyncTask 串行,在 1.6 之后版本,采用线程 池处理并行任务,但是从 Android 3.0 开始,为了避免 AsyncTask

55200

AndroidUI设计与后台线程交互

本文将讨论Android应用程序线程模型以及如何使用线程来处理耗时较长操作,而不是在主线程中执行,保证用户界面(UI)流畅运行。本文还将阐述一些用户界面(UI)中与线程交互API。...然面不幸,它违反了用户界面单线程模型:Android用户界面工具包不是线程安全,只能在UI线程中操作它,在上面的代码中,你在一个工作线程调用mImageView.setImageBitmap(...b),将会发生意想不到错误,这种错误是非常难跟踪和调试。...我们必须通过继承AsyncTask类来使用它,非常重要一点AsyncTask必须在UI线程中实例化它,并且只能执行一次。...◆您可以从任何线程随时取消任务 不管你是否使用AsyncTask,时刻牢记单一线程模型两条规则: 1、不要锁住用户界面。 2、确保只在UI线程中访问Android用户界面工具包中组件。

95050

Android Handler机制13之AsyncTask源码解析

线程规则,这个类必须遵循有关线程一些规则才能正常使用,规则如下: 必须在UI线程上加载AsyncTask类,android4.1上自动完成 任务实例必须在UI线程上实例化 execute()方法必须在主线程调用...第一引入AsyncTask,AsyncTasks在单个后台线程串行执行。在android1.6以后,这被更改为允许多个任务并行操作线程池。...从android 3.0开始,每个任务都是执行在一个独立线程上,这样可以避免一些并行执行引起常见应用程序错误。...在Android HONEYCOMB开始,又变回了在单个线程上执行,这样可以避免并行执行错误。...而这些变更最好连续执行,因为这样可以保证工作有序化,无论平台版本如何,你可以使用SERIAL_EXECUTOR。 必须在UI主线程调用此方法。

78310

Android线程-AsyncTaskyi(一)

* 在主线程中,当异步任务被取消,该方法将被调用, * 要注意这个onPostExecute将不会被执行 */ @Override protected...(5)onCancelled(),在主线程中执行,当异步任务被取消,该方法将被调用,要注意这个onPostExecute将不会被执行。...(1) AsyncTask实例必须在主线程(UI线程)中创建 ,execute方法也必须在主线程调用 (2) 不要在程序中直接调用onPreExecute(), onPostExecute(Result...二、AsyncTask在不同android版本差异 这里我们主要区分一下android3.0前后版本差异,在android 3.0之前,AsyncTask处理任务默认采用线程池里并行处理任务方式...,而在android 3.0之后 ,为了避免AsyncTask处理任务所带来并发错误AsyncTask则采用了单线程串行执行任务。

61120

Android线程实现方式

Android线程实现方式 通常来说,一个应用至少有一个进程,而一个进程至少有一个线程线程 CPU 调度基本单位,进程系统资源分配基本单位。...AsyncTask 必须在主线程中创建实例,execute() 方法也必须在主线程调用。...Android 3.0 之后, AsyncTask 对象默认执行多任务串行执行,即 mAsyncTask.execute() ,并发执行的话需要使用 executeOnExecutor()。...Android 2.3 以前,AsyncTask 线程池容量 128 ,全局线程池只有 5 个工作线程,如果运用 AsyncTask 对象来执行多个并发异步任务,那么同一间最多只能有 5 个线程同时运行...,looper 在一个子线程中执行,我们必须等 mLooper 创建完成之后,才能调用 getLooper ,源码中通过 wait 和 notify 解决两个线程同步问题。

87040

Android线程AsyncTask使用教程(含实例讲解)

Android线程:实现Runnable接口使用(含实例教程) 复合使用 Android线程AsyncTask使用教程(含实例讲解) Android线程AsyncTask原理及源码分析...使用步骤 AsyncTask使用步骤有4个: 创建 AsyncTask 子类 & 根据需求实现核心方法 创建 AsyncTask子类实例对象(即 任务实例) 手动调用execute(()从而执行异步线程任务...子类实例对象(即 任务实例) * 注:AsyncTask子类实例必须在UI线程中创建 */ MyTask mTask = new MyTask(); /** * 步骤3:手动调用execute...必须在UI线程调用 * b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常 * c....AsyncTask,最好在Activity 或 FragmentonDestory()调用 cancel(boolean); 7.2 关于 内存泄漏 结论 若AsyncTask被声明为Activity

70620

About ExecutorService(4),AsyncTask番外篇

蜂巢3.1 由此便可得出结论,3.2及其之后,AT线程使用串行代替并行。 但是...... 前两天做消息推送时候需要使用一些AndroidCompat(兼容)包或类。...多核时代来临,使用线程可以显著提高系统性能,但是,单线程真的“一无处”了吗,答案依然是否定,对于那些单线程或者单任务程序来说,主要资源都消耗在任务本身,既不需要维护并行数据结构间一致性状态...,也不需要为线程切换和调度花费不必要时间,而且,对于多线程而言,系统除了处理任务外,还需要维护多线程环境特有信息,比如:线程本身数据元,线程调度,甚至线程上下文切换等。...因此,在使用“锁”时候,我们也应该尽量考虑以下几点: 减少锁持有时间 只在必要进行同步,这样就能明显减少线程持有锁时间,提高系统吞吐量 减小锁粒度 缩小锁定对象范围,从而减少锁冲突可能性...因为锁竞争与释放,也是需要消耗资源,因此当我们需要在循环内请求锁, 需要写成这样: synchronized (this) { for (int i = 0; i < count

26540

android防止内存溢出浅析

Android虚拟机基于寄存器Dalvik,它最大堆大小一般16M。...比如:Context(下文中提到Activity都是Context),在一些你需要保持你首个类对象状态,并且把状态传入其他类对象中,这样消除掉首个类对象之前,你必须先把接收类对象释放掉。...需要注意一点:因为在Java或者Android内存机制中,顶点结点释放前必须保证其他对象没有调用才能被系统GC回收释放。...有些人喜欢用Android提供AsyncTask,但事实上AsyncTask问题更加严重,Thread只有在run函数不结束才出现这种内存泄露问题,然而AsyncTask内部实现机制运用了ThreadPoolExcutor...,该类产生Thread对象生命周期不确定应用程序无法控制,因此如果AsyncTask作为Activity内部类,就更容易出现内存泄露问题。

64750

安卓开发_浅谈AsyncTask

一、先介绍一下AsyncTask:   在开发Android移动客户端时候往往要使用线程来进行操作,我们通常会将耗时操作放在单独线程执行,避免其占用主线程而给用户带来不好用户体验。...但是在子线程中无法去操作主线程(UI 线程),在子线程中操作UI线程会出现错误。因此android提供了一个类Handler来在子线程中来更新UI线程,用发消息机制更新UI界面,呈现给用户。...用于显示任务执行进度。   6、onCancelled(),在用户取消线程操作时候调用。在主线程调用onCancelled()时候调用。   几个方法有规律。   ...四、几条必须遵守准则:   在使用时候,有几点需要格外注意:   1.异步任务实例必须在UI线程中创建。   ...2.execute(Params... params)方法必须在UI线程调用

1.7K70
领券