android线程

Android的UI设计与后台线程交互

ぐ巨炮叔叔 提交于 2019-12-05 13:11:27
本文将讨论Android应用程序的线程模型以及如何使用线程来处理耗时较长的操作,而不是在主线程中执行,保证用户界面(UI)的流畅运行。本文还将阐述一些用户界面(UI)中与线程交互的API。 UI用户界面线程 当应用程序启动时,系统会为应用程序创建一个主线程(main)或者叫UI线程,它负责分发事件到不同的组件,包括绘画事件。完成你的应用程序与Android UI组件交互。 例如,当您触摸屏幕上的一个按钮时,UI线程会把触摸事件分发到组件上,更改状态并加入事件队列,UI线程会分发请求和通知到各个组件,完成相应的动作。 单线程模型的性能是非常差的,除非你的应用程序相当的简单,特别是当所有的操作都在主线程中执行,比如访问网络或数据库之类的耗时操作将会导致用户界面锁定,所有的事件将不能分发,应用程序就像死了一样,更严重的是当超过5秒时,系统就会弹出“应用程序无响应”的对话框。 如果你想看看什么效果,可以写一个简单的应用程序,在一个Button的OnClickListener中写上Thread.sleep(2000),运行程序你就会看到在应用程序回到正常状态前按钮会保持按下状态2秒,当这种情况发生时,您就会感觉到应用程序反映相当的慢。 总之,我们需要保证主线程(UI线程)不被锁住,如果有耗时的操作,我们需要把它放到一个单独的后台线程中执行。 下面是一个点击按钮后下载一个图片

AsyncTask的使用注意事项

对着背影说爱祢 提交于 2019-12-04 08:37:00
AsyncTask的使用注意事项 前面的文章曾建议使用AsyncTask而不是使用Thread,但是AsyncTask似乎又有它的限制,这就要根据具体的需求情况而选择合适的工具,No Silver Bullet。 下面是一些建议: •改善你的设计,少用异步处理 线程的开销是非常大的,同时异步处理也容易出错,难调试,难维护,所以改善你的设计,尽可能的少用异步。对于一般性的数据库查询,少量的I/O操作是没有必要启动线程的。 •与主线程有交互时用AsyncTask,否则就用Thread AsyncTask被设计出来的目的就是为了满足Android的特殊需求:非主线程不能操作(UI)组件,所以AsyncTask扩展Thread增强了与主线程的交互的能力。如果你的应用没有与主线程交互,那么就直接使用Thread就好了。 •当有需要大量线程执行任务时,一定要创建线程池 线程的开销是非常大的,特别是创建一个新线程,否则就不必设计线程池之类的工具了。当需要大量线程执行任务时,一定要创建线程池,无论是使用AsyncTask还是Thread,因为使用AsyncTask它内部的线程池有数量限制,可能无法满足需求;使用Thread更是要线程池来管理,避免虚拟机创建大量的线程。比如从网络上批量下载图片,你不想一个一个的下,或者5个5个的下载,那么就创建一个CorePoolSize为10或者20的线程池

android AsyncTask介绍

南楼画角 提交于 2019-12-04 08:36:33
AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作, 并 提供接口反馈当前 异步执行的程度 (可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点 : l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。 使用的优点: l 结构清晰,功能定义明确 l 对于多个后台任务时,简单,清晰 使用的缺点: l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) AsyncTask介绍 Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程)

Android nice在进程与线程调度中的作用

大城市里の小女人 提交于 2019-12-03 23:03:56
基本概念: 进程:计算机进行资源分配和高度的基本单位,是程序运行的实体,也是线程的容器。 线程:是进程中实际执行的单元,是程序执行的最小单元,属于一个进程。 一个进程可以拥有多个线程。 nice在进程调试中作用 在Android中,可以使用nice值来设定一个进程的优先级,系统的调度器可以根据nice值来合理的调度进程,主要特点如下: 在Android中,nice的取值范围为-20~19 在Android中,nice值的默认大小为0 在Android中,nice值越大,进程的优先级越低,获得的CPU调用机会就越少;nice值越高,进程的优先级越高,获得的CPU调用机会越多 在Android中,父进程fork出来的子进程nice值与父进程相同,你进程renice后,子进程的nice值不会改变 如何更改进程的nice值 Android中可用如下命令更改进程的nice值, usage: nice [-n PRIORITY] command [args...] Run a command line at an increased or decreased scheduling priority. Higher numbers make a program yield more CPU time, from -20 (highest priority) to 19 (lowest). By

详解Android中AsyncTask的使用

有些话、适合烂在心里 提交于 2019-12-03 19:39:19
在Android中实现异步任务机制有两种方式,Handler和AsyncTask。 Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。 关于Handler的相关知识 ,前面也有所介绍,不清楚的朋友们可以参照一下。 为了简化操作,Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。 先来看看AsyncTask的定义: [java] view plain copy public abstract class AsyncTask<Params, Progress, Result> { 三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。 一个异步任务的执行一般包括以下几个步骤: 1. execute(Params... params) ,执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。 2. onPreExecute()

Java线程切换(一)

柔情痞子 提交于 2019-12-03 11:20:34
摘自: https://www.cnblogs.com/woyuwozhouxuanjiu-ningzuowo/p/11774265.html Java线程切换(一) (本文由言念小文原创,转载请注明出处) 一 前言 有Android开发经验的同学都清楚,UI的更新必须在主线程中进行,且主线程不能被阻塞,否则系统ANR异常。我们往往做一些数据处理是耗时操作,必须要在子线程中进行,然后再将处理后的数据切换到主线程去更新UI,这便是线程切换。 线程切换的本质是“数据的切换”,即将数据从一个线程传递到另一个线程。 二 案例描述 老风格,先给出场景案例,然后通过线程切换实现该案例。 案例:在线程A中调用api发送一段数据data,data最终通过线程切换由线程B执行数据处理动作。 三 线程切换基本原理 所谓线程切换,本质就是“数据在线程间切换”,即将一个线程A中的数据,传递到另一个线程B执行数据处理操作。基于以上认知,比较自然的实现逻就是:将线程A中的数据进行拷贝,线程B获取到拷贝数据,然后进行处理,如下图所示。 四 案例实现代码 首先创建一个DataHandler类,该类中定义了数据拷贝方法和数据处理线程。在DataHandler中定义了一个用于数据副本存放的成员变量mData;外部模块可通过sendData()将数据拷贝到DataHandler中

23 个重难点突破,带你吃透 Service 知识点「长达 1W+ 字」

有些话、适合烂在心里 提交于 2019-12-03 09:28:33
前言 学 Android 有一段时间了,想必不少人也和我一样,平时经常东学西凑,感觉知识点有些凌乱难成体系。所以趁着这几天忙里偷闲,把学的东西归纳下,捋捋思路。 这篇文章主要针对 Service 相关的知识点,进行详细的梳理,祝大家食用愉快! 文章目录 方便大家学习,我在 GitHub 建立了 仓库 仓库内容与博客同步更新。由于我在 稀土掘金 简书 CSDN 博客园 等站点,都有新内容发布。所以大家可以直接关注该仓库,以免错过精彩内容! 仓库地址: 超级干货!精心归纳 Android 、 JVM 、算法等,各位帅气的老铁支持一下!给个 Star ! # 第一篇:Service 是什么 1.1 什么是 Service Service (服务) 是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。 服务可由其他应用组件启动(如 Activity ),服务一旦被启动将在后台一直运行,即使启动服务的组件( Activity )已销毁也不受影响。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 ( IPC )。 1.2 Service 通常总是称之为 “后台服务” 其中 “后台” 一词是相对于前台而言的,具体是指:其本身的运行并不依赖于用户可视的 UI 界面 因此,从实际业务需求上来理解, Service 的适用场景应该具备以下条件: 并不依赖于用户可视的 UI

Android 异步处理AsyncTask

前提是你 提交于 2019-12-03 06:31:58
AsyncTask 和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作, 并 提供接口反馈当前 异步执行的程度 (可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点 : l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。 使用的优点: l 结构清晰,功能定义明确 l 对于多个后台任务时,简单,清晰 使用的缺点: l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) AsyncTask介绍 Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程)

Java线程切换(一)

旧时模样 提交于 2019-12-03 02:38:13
(本文由言念小文原创,转载请注明出处) 一 前言 有Android开发经验的同学都清楚,UI的更新必须在主线程中进行,且主线程不能被阻塞,否则系统ANR异常。我们往往做一些数据处理是耗时操作,必须要在子线程中进行,然后再将处理后的数据切换到主线程去更新UI,这便是线程切换。 线程切换的本质是“数据的切换”,即将数据从一个线程传递到另一个线程。 二 案例描述 老风格,先给出场景案例,然后通过线程切换实现该案例。 案例:在线程A中调用api发送一段数据data,data最终通过线程切换由线程B执行数据处理动作。 三 线程切换基本原理 所谓线程切换,本质就是“数据在线程间切换”,即将一个线程A中的数据,传递到另一个线程B执行数据处理操作。基于以上认知,比较自然的实现逻就是:将线程A中的数据进行拷贝,线程B获取到拷贝数据,然后进行处理,如下图所示。 四 案例实现代码 首先创建一个DataHandler类,该类中定义了数据拷贝方法和数据处理线程。在DataHandler中定义了一个用于数据副本存放的成员变量mData;外部模块可通过sendData()将数据拷贝到DataHandler中;在DataHandler构造中初始化数据处理线程(线程B);该线程重写的run()方法中用一个while循环不停查询数据副本mData的值,当检测到mData有数据时,则执行数据处理动作,数据处理完成后

Android访问网络的常用方式:Handler、AsyncTask简单例子(服务器端+Android端)

匿名 (未验证) 提交于 2019-12-03 00:43:02
首先应该明白两点: 1.Android不允许在主线程(对于android来说,主线程就是UI线程)中访问网络。 2.Android不允许在一个子线程中直接去更新主线程中的UI控件。 对于问题1,可能你会说,这还不好办吗?再开一个线程不就完了?是的,你很聪明,原理也很简单。 对于问题2,就需要用到线程间通信(IPC),Android很好的将其进行了封装,也就有了今天的Handler和AsyncTask。 适用情况: AsyncTask是一个轻量级的后台异步任务类,简单、便捷。适合后台任务不太多的情况,因为每一个后台任务都要写成一个Class去继承AsyncTask,代码显得比较臃肿。否则就使用Handler吧,很强大,但对于新手来说较难掌握 使用方法: AsyncTask定义了三种泛型类型 Params,Progress和Result 。 Params 启动任务执行的输入参数,比如HTTP请求的URL。 Progress 后台任务执行的百分比。 Result 后台执行任务最终返回的结果,比如String。 最少要重写以下方法: doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…