android中handlerthread与handler + thread区别

2024-03-07 23:32

本文主要是介绍android中handlerthread与handler + thread区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

            工作之间随手写的,handler + thread是初学者喜欢用的,为了不影响ui线程,开辟一个新的thread进行耗时操作,操作结束后需要更新ui,就需要通过handler进行

sendmessage来与ui线程通信,提醒一下在创建handler的时候,大部分初学者没有注意到参数Looper,它是负责不断循环处理线程中的message.很多人会问我没有注意创建

looper啊,这是系统默认在ui线程中创建了一个looper,这个looper就是负责ui线程的消息。简单的说当你开辟新的线程处理完耗时操作发送message后,handler中

handleMessage()方法就在ui线程中执行。

          现在有一个场景,比如我发送请求想服务器下载图片,服务器返回图片后,我想把这张图片保存在本地,保存图片也是一个耗时操作,但是我不想在ui线程中执行保存操作,也不想重新开辟一个线程,简单的说图片请求与图片保存都在一个线程中执行就需要用到handlerthread,对于looper+handler+thread的关系不清的,可以看看其他博文,这里直接上代码了


public class MainActivity extends Activity {//默认创建一个handler帮顶在ui线程上private Handler handler = null;private Button mbutton = null;private HandlerThread handlerthread;private Handler secondhandler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i("shao", "test  handler");mbutton = (Button)findViewById(R.id.shaobutton);mbutton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub//创建handlerthreadhandlerthread = new HandlerThread("shaohandler");handlerthread.start();    secondhandler = new Handler(handlerthread.getLooper(), new Handler.Callback() {   //这里的looper是开辟thread中的looper,专门负责这个线程的消息处理	@Overridepublic boolean handleMessage(Message msg) {Log.i("shao", "SecondHandler.CallBack::::" + Thread.currentThread().getId());return false;}});secondhandler.post(new Runnable() {@Overridepublic void run() {Log.i("shao", "SecondHandlerThread" + Thread.currentThread().getId());secondhandler.sendEmptyMessage(2);}});}});//主线程有默认的looper就是与主线程绑定 handler = new Handler(new Handler.Callback() {       //ui线程默认有自己的looper @Override  public boolean handleMessage(Message msg) {  // TODO Auto-generated method stub  Log.i("shao", "Handler.CallBack::::" + Thread.currentThread().getId());//System.out.println("Handler.CallBack::::" + Thread.currentThread().getId());  return false;  }  });new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubLog.i("shao", "new thread::::" + Thread.currentThread().getId());//System.out.println("new thread::::" + Thread.currentThread().getId());handler.sendEmptyMessage(0);}}).start();}
看一下运行结果:

06-29 23:20:46.274: I/shao(817): test  handler
06-29 23:20:46.284: I/shao(817): new thread::::78
06-29 23:20:46.304: I/shao(817): Handler.CallBack::::1
06-29 23:20:55.194: I/shao(817): SecondHandlerThread79
06-29 23:20:55.204: I/shao(817): SecondHandler.CallBack::::79

这样就更加明白looper+thread+handler的关系了,可以更加深入理解



这篇关于android中handlerthread与handler + thread区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785207

相关文章

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现