《Android开发艺术探索》第十章Android的消息机制、十一章线程和线程池小结

XY2-100协议解析 1.XY2-100包括四路信号 : SENDCK(时钟信号)、SYNC(同步信号)、CHANNELX(X通道)、CHANNELY(Y通道) 阅读详情

1. Handler可以将更新UI的操作切换到主线程,MessageQueue采用单链表来存储消息,Looper回无限循环的查找新消息,ThreadLocal可以在每个线程中存储数据,Handler的send被调用时,会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中,然后Looper发现有新消息就会处理,最终消息中的Runnable或者Handler的handleMessage就会被调用。注意Looper是运行在创建Handler所在的线程中的,这样Handler的业务逻辑就被切换到Looper的线程中了。


2. ThreadLocal的工作原理

1)线程内的全局对象;

private ThreadLocal<Boolean> mBooleanThreadLocal = new ThreadLocal<Boolean>();

mBooleanThreadLocal.set(true);

2)不同线程访问同一个ThreadLocal的get方法,ThreadLocal内部会从各自线程中取出一个数组,然后再从数组中根据当前ThreadLocal的索引去查找出对应的value值;

3)set方法:Thread.currentThread()获取当前线程,通过当前线程得到ThreadLocal.Values对象,内部还有Object[]数组,ThreadLocal的值就存在这个数组中。

ThreadLocal.Values.put(ThreadLocal<?> key, Object value)

4)MessageQueue用单链表实现的,主要包含插入和读取操作,enqueueMessage和next,插入时会根据Message的when属性排序,读取伴随着删除,读不到会阻塞;

5)Looper.prepare会为当前线程创建Looper,并在内部创建MessageQueue,之后调用loop开启循环;Looper的prepareMainLooper方法会把创建的looper保存在进程的静态变量中,作为主线程的looper;quit会直接退出Looper,而quitSafely只是设定一个退出标记,等消息队列处理完毕后才退出;退出后Handler的send方法会返回false;在自线程中如果手动创建了Looper,那么之后应该调用quit终止消息循环,否则自线程一直处于等待状态,退出Looper后子线程也会自动终止。loop方法会调用MessageQueue的next方法来获取信息,获取不到就回阻塞,获取到就调用msg.target.dispatchMessage,将Handler的逻辑在Looper所在的线程中执行;

6)Handler发送消息时会调用MessageQueue的enqueueMessage,处理消息时先调用Message的callback,为空则调用mCallback.handleMessage,再为空则调用handleMessage;Handler的默认无参构造函数会使用当前线程的Looper,也可以传入一个looper。

7)主线程的main的工作:创建Looper,创建ActivityThread,保存Handler,初始化AsyncTask;


3. AsyncTask封装了Thread和Handler,它不适合进行特别耗时的任务,特别耗时的任务建议使用线程池;onPreExecute()在主线程中,doInBackground(Params...)执行异步任务,通过publishProgress更新进度,onProgressUpdate(Progress...)在主线程中更新进度,onPostExecute(Result r)在主线程中异步任务执行后调用,onCancelled方法在主线程中调用;AsyncTask对象的创建和execute调用必须在主线程中,execute只能执行一次,默认的AsyncTask是串行的;exec中调用默认的静态串行线程池sDefaultExecutor执行FutureTask,FutureTask中被传入WorkerRunnable,其中的call方法调用了doInBackground,算出结果后post到主线程的handler中,再调用onPostExecute携带计算结果;


4. HandlerThread

继承了Thread,并且创建了Looper,可以继承onLooperPrepared方法,在它内部创建Handler,接收外界消息在内部处理,用在IntentService中;


5. IntentService

继承了Service,作用很像一个后台进程,但是IntentService是一种服务,它不容易被系统进程杀死而可以尽量保证任务的执行;它封装了HandlerThread和Handler。每次启动IntentService,onStartCommand就会被执行,将Intent包装成Message,再由Handler处理,Handler调用onHandleIntent处理具体Intent,并调用stopSelf(startId)在所有消息都处理完毕后终止服务。每执行一次后台任务就必须重启一次IntentService,IntentService中的Looper是顺序执行后台任务的,onHandleIntent可以根据Intent的不同Action来判断不同的Intent。


6. 线程池

1)优点:可重用避免创建销毁线程的开销;有效控制最大并发数,避免大量线程相互抢占系统资源导致的阻塞现象;可以定时执行或者指定间隔循环执行;

2)ThreadPoolExecutor创建线程池:corePoolSize核心线程数,默认状态下即使空闲也存活,除非设置allowCoreTimeOut;maximumPoolSize最大线程数,达到这个值后续任务将被阻塞;keepAliveTime空闲的最大时长,超过则被回收;unit时间单位;workQueue任务队列,通过线程池的excute提交的Runnable对象列表;threadFactory创建线程的工厂;无法执行新任务时会调用handler的rejectedExecution方法;

3)ThreadPoolExecutor规则:线程池中未达到核心线程数辆,则直接启动一个核心线程执行任务;线程数辆超过核心线程数则任务会排队;如果任务队列已满,则启动非核心线程执行任务;非核心线程也达到最大值,则调用rejectedExecution方法;

4)AsyncTask对THREAD_POOL_EXECUTOR(5.0版本)的配置,核心线程数位CPU数+1,最大线程数为CPU核心数2倍+1,非核心线程1秒超时,任务队列容量128;

5)分类:FixedThreadPool只有核心线程,不会被回收,队列无限制,能快速响应外界请求;CacheThreadPool无限数量的非核心线程,60秒超时,队列容量为空,适合执行大量耗时较少的任务;ScheduledThreadPool有固定的核心线程,无限的非核心线程,空闲时间为0,适合执行定时任务和有固定周期的重复任务,调用scheduleAtFixedRate;SingleThreadExecutor只有一个核心线程,无限队列,将所有任务变成串行处理。

080、多轴运动控制:插补器设计(螺旋线插补) 本文分享了螺旋线插补器设计的实战经验。针对五轴点胶机Z轴抖动问题,作者分析了螺旋线数学本质,提出基于归一化时间参数的速度规划方法,强调各轴严格同步的重要性。文章详细介绍了速度分解、加减速处理、嵌入式优化技巧(查表法、定点化),并总结了起点闭合、速度波动、数值处理等常见问题解决方案。最后给出5条实用建议:注重速度规划而非纯数学推导、预先仿真、保留调试接口、考虑机械谐振、防范编码器丢脉冲。通过优化插补周期、电子齿轮比和S形速度曲线,成功将设备良率从60%提升至95%。 阅读详情

相关推荐

微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

j0k1l2m3n的博客 458

《Android开发艺术探索》第11章-Android 的线程和线程池读书笔记

目录1. 前言2. 正文2.1 主线程和子线程2.1.1 在 Android 中,可以扮演线程角色的类有哪些?2.1.2 线程池的好处是什么?2.1.3 Android 中主线程和子线程的职责分别是什么?2.2 Android 中的线程形态2.2.1 AsyncTask 实际开发中如何使用?2.2.2 AsyncTask 的两个操作方法,三个泛型参数和五个核心方法分别是什么?2.2.3 AsyncTask 在使用过程中有哪些限制?2.2.4 AsyncTask 的类加载是在哪里完成的?会完成哪些工作?2..

willwaywang6 3899

秋叶ComfyUI-v10中文整合包:全中文AI绘画一键部署与实战指南

Stable Diffusion作为当前主流的扩散模型,通过去噪过程从随机噪声生成高质量图像,其开源特性推动了AI绘画技术的普及。然而,其官方WebUI在自定义工作流和可复现性上存在局限,而基于节点流程的ComfyUI则提供了更高的自由度和工程化控制能力,尤其适合复杂、可重复的创作流程。对于中文用户而言,英文界面和提示词输入是主要障碍。秋叶出品的ComfyUI-v10中文整合包,正是针对这一痛点,提供了**全中文界面**和**原生中文提示词支持**的解决方案。该整合包将Python环境、依赖库及常用插件预配

weixin_33895475的博客 401

Android的线程和线程池--《Android开发艺术探索》阅读笔记——第十一章

Android中的线程形态: AsyncTask、HandlerThread、IntentService Android中的线程池: ThreadPoolExecutor

胡飞洋的技术积累 4672

Arch Linux双系统安装避坑指南:从Windows分区到桌面环境全流程

本文提供了一份详尽的Arch Linux与Windows双系统安装避坑指南。内容涵盖从安装前的UEFI环境确认、BitLocker处理、分区规划,到Live环境进入、基础系统安装、GRUB引导配置,再到显卡驱动安装、KDE/GNOME桌面环境部署及中文化设置的全流程。重点解决了双系统安装中的核心痛点,帮助用户在不破坏现有Windows系统的前提下,顺利完成Arch Linux的安装。

nice1的博客 535

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

《Android开发艺术探索》完结篇

笔记链接: 《Android开发艺术探索》之Activity的生命周期和启动模式(一) 《Android开发艺术探索》之IPC机制上(二) 《Android开发艺术探索》之IPC机制下(三) 《Android开发艺术探索》之View的事件体系(四) 《Android开发艺术探索》之View的工作原理(五) 《Android开发艺术探索》之理解RemoteViews、BroadCastR...

云瀚的自习室 3373

开源DIY | 打造会“听”会“走”的智能移动垃圾桶

本文详细介绍了如何利用Arduino和超声波传感器打造一款会“听”会“走”的智能移动垃圾桶。通过开源硬件和简单编程,实现声控移动和自动避障功能,适合创客爱好者和家庭DIY。项目成本控制在200元内,涵盖硬件搭建、电路连接和核心功能实现,是入门级机器人制作的理想选择。

weixin_33670713的博客 231

Android开发艺术探索

Android开发艺术探索 去发现同类优质开源项目:https://gitcode.com/ 本书《Android开发艺术探索》是由任玉刚编写的一本深入探讨Android应用开发的进阶书籍。书中采用了理论、源码与实践相结合的方法,全面阐述了Android应用开发的高级要点。 内容概述 全书分为十五章,从不同角度深入解析了Android开发中的关键技术和性能优化策略: 第一章:Activity的生...

gitblog_06721的博客 693

基于RK3588与Gstreamer的端侧实时视频流AI推理系统构建

本文详细介绍了基于RK3588芯片与Gstreamer框架构建端侧实时视频流AI推理系统的完整方案。通过硬件选型、环境配置、OpenCV编译优化、视频流处理实战及模型部署等关键环节的深入解析,展示了如何利用RK3588的6TOPS NPU算力与Gstreamer的低延迟特性,实现工业质检、智能交通等场景下的高效边缘计算。特别针对RTSP推拉流优化、RKNN模型转换等核心技术难点提供了实用解决方案。

weixin_30516243的博客 381

AXI4协议之AXI4-Lite接口详解及实战

本文首先对AXI4总线协议进行了一个简单的介绍,然后使用vivado提供的模板创建了一个AXI4-Lite Master的接口,并生成了一个具有Master和Slave的代码实例,阅读该示例代码,进行修改后用于自己的项目。

高阶近似的博客 2万+

《Android开发艺术探索》之安卓的线程和线程池(十三)

第11章 Android的线程和线程池 线程分为主线程和子线程,主线程负责处理UI界面操作,子线程负责执行耗时操作,由于Android的特性,主线程执行耗时过长就会ANR。除了Thread本身之外,AsyncTask、IntentServi...

云瀚的自习室 1008

7.6 GPU页表更新机制

本文分析了AMDGPU驱动中BO到VA映射的页表更新实现机制。核心流程通过amdgpu_vm_bo_update()函数触发,支持CPU直接写入和SDMA异步命令两种更新模式。系统根据VRAM可见性自动选择最优更新策略,处理三种主要场景:命令提交、BO迁移和BO销毁。关键实现包括DMA地址数组处理、权限标志合并和BO迁移状态转换,最终通过amdgpu_vm_update_range()完成硬件页表更新。该机制有效平衡了更新延迟与吞吐量,为GPU虚拟内存管理提供基础支撑。

图形/计算GPU的驱动与虚拟化技术分享园地 2470

Android开发艺术探索完结篇——天道酬勤

这片文章发布,代表着我已经把本书和看完并且笔记也发布完成了,回忆了一下我看Android群英传,只用了两个月,但是看本书却花了2016年05月04日 - 2018年07月16日,整整两年多,真是惭愧 笔记链接 Android开发艺术探索——新的征程,程序人生路漫漫! Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式 Android开发艺术探索——第二章:IPC...

刘桂林的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android线程与线程池《Android开发艺术探索》笔记

文章目录概述线程形态AsyncTask概述与使用原理HandlerThreadIntentService工作原理线程池线程池的优点与构成线程池的分类 参考文章:要点提炼|开发艺术之线程。 概述 线程是CPU调度的最小单元。 线程是一种受限的资源,不能多次的创建与停止。 分类: 主线程:一般一个线程只有一个主线程。主线程中一般用于UI操作,用于与用户交互。 子线程:子线程中一般执行耗时操作,比如网络...

一名正在成长的程序员 430

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《Android开发艺术探索》

序 昨晚准备参考一下 《Android 开发艺术探索》这本书写一个博客 ,但是在家里找了好长时间也找不见 。所以就找了网上的文章 。这本书强烈推荐大家好好读几遍 。 《Android开发艺术探索》之Activity的生命周期和启动模式(一) 《Android开发艺术探索》之IPC机制上(二) 《Android开发艺术探索》之IPC机制下(三) 《Android开发艺术探索》之...

Super 含 的博客 515

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

《android开发艺术探索》笔记

android开发艺术探索笔记第一章Activity的生命周期和启动模式1.1 生命周期1.1.1 正常情况下的生命周期分析1.1.2 异常情况下的生命周期分析1.2 Activity的启动模式1.2.2 Activity的Flag1.2.3 IntentFilter的匹配规则第二章 IPC机制 第一章Activity的生命周期和启动模式 1.1 生命周期 1.1.1 正常情况下的生命周期分析 (1)第一次启动:onCreate->onStart->onResume。 (2)当用户打开一个新的

chen_xiaoke的博客 5827

Android艺术开发探索——11.线程和线程池

1.概述 操作系统中,线程是操作系统调度的最小单位,当系统中存在大量的线程时,系统会通过时间片转轮的方式调度每个线程,所以线程不可能做到绝对的并行。 采用线程池,一个线程池中会缓存一定数量的线程,通过线程池可以避免因为频繁创建和销毁线程带来的系统开销 java中默认情况下一个进程只有一个线程,是主线程。 主线程:处理界面交互相关逻辑,必须有较高的响应速度 子线程:也叫工作线程,除了主线程以外的线程 在Android中,几乎完全采用了Java中的线程机制 主线程:也叫UI线程,运行四大组件以及处理

xuan的博客 236

Android开发的艺术探索第十一章(Android的线程和线程池)

在Android中可以扮演线程角色的还有很多,比如AsyncTask和IntentService,同时 HandlerThread也是一种特殊的线程。尽管AsyncTask、IntentService以及HandlerThread的表 现形式都有别于传统的线程,但是它们的本质仍然是传统的线程。对于AsyncTask来说, 它的底层用到了线程池,对于IntentService和HandlerThre...

wyjlovecr7的博客 257

Android开发艺术探索——Android的线程和线程池

这是我在学习过程中总结的知识 目的是希望日后回来看或者需要用的时候可以 一目了然 # 的回顾、巩固、查缺补漏 不追求详细相当于书本的精简版或者说是导读(想看详细的直接对应翻书),但会尽力保证读者都能快速理解和快速使用(随理解加深会总结的更加精简),但必要时会附上一些较详细解释的链接 脚注是空白的:表示还没弄懂的知识,了解后会添加 文章目录@[TOC]11.1 主线程和子线程11.2 Android...

Xeldow的博客 218

[学习笔记]Android开发艺术探索:Android的线程和线程池

在Android系统,线程主要分为主线程和子线程,主线程处理和界面相关的事情,而子线程一般用于执行耗时操作。 在Android中,线程的形态有很多种: ​ i. AsyncTask封装了线程池和Handler。 ​ ii. HandlerThread是具有消息循环的线程,内部可以使用handler ​ iii. IntentService是一种Service,内部采用HandlerThread来执...

尘埃zza的博客 271

Android开发艺术探索笔记

《Android开发艺术探索》这本书在几年前就已经买了,陆陆续续看过几次,都没有看完,没有理解透。 最近重读《Android开发艺术探索》,读了两次,第一次读完感觉还有大量的知识点没有理解,再次阅读,练习书中例子,记读书笔记,理解加深了几分。 [学习笔记]Android开发艺术探索:Activity的生命周期和启动模式 [学习笔记]Android开发艺术探索:IPC机制 [学习笔记]A...

尘埃zza的博客 494

Android 开发艺术探索笔记(21),2024年互联网大厂Android面经总结

即调用了Handler的dispatchMessage。dispatchMessage先检查msg的callback是否为null,不为null就通过handleCallback来处理信息。

m0_57502067的博客 1024

《Android 开发艺术探索》读书笔记完整版

第一章 Activity的生命周期和启动模式 第二章 IPC机制 第三章 View的事件体系 第四章 View的工作原理 第五章 理解RemoteViews 第六章 Android的Drawable 第七章 Android动画深入分析 第八章 理解Window和WindowManager 第九章 四大组件的工作过程 第十章 Android的消息机制 第十一章 Androi...

JiandaoStudio 620

《Android开发艺术探索》初步记录

简单的记录。

qq_45077023的博客 1338

Android 开发艺术探索笔记(21),作为Android开发程序员

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题PDF,大家有兴趣的可以自行领取或者私信我:还有。

m0_60388261的博客 1036
上一篇: 《Android开发艺术探索》第九章四大组件的工作过程小结
下一篇: 《Android开发艺术探索》第十二章Bitmap加载和Cache小结
doom20082004
博客等级 码龄19年 2粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值