任务 Runnable 定义了一个可以独立运行的代码片段,通常用于界面控件的延迟处理,比如为了避免同时占用某种资源造成冲突,有时则是为了反复间隔刷新界面从而产生动画效果。

运行 个任务也有多种形式,既能在 线程中调用处理器对象的 post postDelayed 方法,也能另 外开启分线程来执行 Runnable 对象。在运行任务之前,必须事先声明该任务的对象,然后才能由 调用者执行该任务。

Koltin中声明 Runnable 对象有4 种方式,分别对应不同的业务场景,

4种声明方式:内部类、 匿名内部类、简化类实例 、匿名实例。

1.内部类:

先书写 个继承自 Runnable 的内部类,再重写它的 run 方法,填入具体的业务逻辑处理。

    private val handler = Handler()private var count = 0//inner修饰符表示这是一个内部类private inner class Counter1 : Runnable{override fun run() {count++result.text = "当前计数值:$count"handler.postDelayed(this,1000)}}调用:        handler.post(Counter1())

缺点:啰嗦。

注:使用inner修饰符表示这是一个内部类

2.匿名内部类:

上面的例子并不需要对其显式构造,只要在定义内部类时顺便声明该任务的实例即可。

 private val counter2 = object : Runnable{override fun run() {count++result.text = "当前计数值:$count"handler.postDelayed(this,1000)}}调用:        handler.post(counter2)

注:使用关键字 object 占位,表示这是一个匿名内部类


内部类与匿名内部类这两种方式其实内部都拥有类的完整形态,故而它们的 run 方法允许使 关键字 this 指代自身的任务对象,于是 例代码中的“handler.postDelayed(this, 1000)” 表示间隔 1秒之后重复执行自身任务。正因为能够重复执行任务,所以这两种方式可用于持续刷新界面的动画。


3.简化类实例:

上面的方式1、2意味着必须显式重写 run 方法,可是这个任务类 肯定只能重写 ,即使开发者不 写出来, run 方法也 是逃不掉的。

只要说明该实例是 Runnable 类型, 多余的 run 方法就能去掉。

 private val counter3 = Runnable {count++result.text = "当前计数值:$count"}调用:      handler.post(counter3)

缺点:表面上代码变得简洁,但是并不拥有类的完整 结构,其内部的 this 关键字不再表示任务类自身,而是表示宿主类(即 Activity 活动类),该方式内部不可再调用处理器的 post、postDelayed 方法 。意味着此时任务实例无法重 复调用自身。 因此,采取简化类实例的任务对象适用于不需要重复刷新的场合。

4.匿名实例:

方式3中的counter3 经过等号赋值的任务实例,既然这样,不如 接把 等号右边的表达式加入 post 法中。

//在 post 方法中直接填写 Runnable 对象的定义代码handler.post(Runnable {count++result.text = "当前计数值:$count"})

观察上面的代码:post 方法只能输入 Runnable 类型的参数,所以括号内部的 Runnable 纯属多余;另外, post 方法有且仅有 1个输入参数,于是圆括号嵌套大括号稍显烦琐,这两个冗余之处分别予以删除与合井:

//如果该任务只需执行一次,就可以采用匿名实例的方式直接嵌入任务的执行代码
handler.post {count++result.text = "当前计数值:$count"}

上面的代码只适合 post 方法这种仅有 1个参数的调用,如果其他方法存在多个输 入参数( postDelayed 方法),那么外层的圆括号仍需予以保留,此时大括号及其内部代码就作 为一个函数参数传入:

//如果是延迟执行任务,就可将匿名实例作为 postDelayed 的输入参数handler.postDelayed({count++result.text = "当前计数值:$count"},1000)

方式4的匿名实例方式直接把任务代码写在调用函数之中,意味着这段任务代码无法被其他地方调用, 所以它的适用场景更加狭小。方式3的简化类实例虽然无法重复调用自身,但是尚且允许在不同地方多次调 用, 而匿名实例只能在它待过的地方昙花一现。

Runnable任务相关推荐

  1. java runnable 启动_Java开发笔记(九十七)利用Runnable启动线程

    前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...

  2. Java多线程,Thread,Runnable,Callable Task,Future<Task>,CompletionService

    一.Java多线程的方法 1. 继承 Thread 2. 实现 Runnable 3. 实现 Callable 可以有返回值 package com.test;import java.util.Arr ...

  3. 一次搞懂 Runnable、Callable、Future、FutureTask,不懂不要钱!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一般创建线程只有两种方式,一种是继承Thread,一种是实 ...

  4. Runnable接口和贪心算法

    1 Runnable接口 Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现.设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议.激活的意思是说某个线程已启动并且尚未停止 ...

  5. JAVA多线程Thread VS Runnable详解

    进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立.所以进程是重量级的任务,它们之间的通信和转换都需要操作系统 ...

  6. 解析 Callable Runnable Future 使用和原理

    2019独角兽企业重金招聘Python工程师标准>>> 概念 Callable类的定义 @FunctionalInterface public interface Callable& ...

  7. Android开发笔记之:Handler Runnable与Thread的区别详解

    From:http://www.jb51.net/article/37465.htm 本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友 ...

  8. 利用Thread 和 Runnable实现多线程,案例演示:《卖票》

    1.实现一个卖票的功能,大家根据在汽车站或者火车站那个卖票的情况,假设有三个窗口,每个窗口就像一个线程,卖票的这几个窗口同时卖票, 就像实现多线程. 1 public class MyRun impl ...

  9. Java中Runnable和Thread的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.la ...

  10. Java多线程——Thread Runnable源码解析

    Java多线程的两种实现方法大家都应该知道了:继承Thread的子类实例化和实现Runnable接口用这个接口实现类去创建Thread实例. Java的线程在Linux平台上使用的是NPTL机制,JV ...

最新文章

  1. tfjob的一篇文章,跟公司内使用方式类似
  2. 2021年茅台销售现新套路,限价控价没有用?
  3. Mozilla开发全新的公开网络API WebXR 来实现增强现实
  4. 冗余的Runnable代码
  5. mac tomcat java_Mac下配置Java开发环境(JDK1.8)和Tomcat服务器
  6. js中对于json判断的总结(持续整理中~)
  7. JSP基本元素(菜鸟教程)
  8. 如何设置路由器的中继模式-机器人局域网组网攻略
  9. 计算机获取信息的过程是,“获取信息的过程与方法”的教学案例
  10. 2021年系统架构设计师考试上午真题与答案
  11. 电脑只能上QQ不能上网怎么办
  12. 11月最新WIFI大师小程序源码/支持无限部署
  13. 虎牙直播电脑配置推荐2021 虎牙直播电脑配置清单
  14. html怎么设置拉伸图片大小,html – 如何在不拉伸的情况下调整图像大小?
  15. 求生之路 自定义服务器,求生之路2·教你如何自定义绑定快捷键
  16. Uni-App - 学习心得
  17. JS中的void 0是什么意思?
  18. Mac新手必备技巧之Excel不可错过的16个实用快捷键
  19. springboot毕设项目养老平台的设计与实现u8sua(java+VUE+Mybatis+Maven+Mysql)
  20. cs和bs架构的区别(bs和cs架构的区别和优缺点)

热门文章

  1. jquery实现点击标题显示内容,同级其他元素内容隐藏
  2. CCTV4:中国智造亮出新名片,深兰科技熊猫公交驰骋粤港澳大湾区!
  3. Maven是什么,以及为什么要使用Maven
  4. 企鹅号搬运视频做伪原创
  5. Metasploit 渗透测试
  6. 查看linux多少位操作系统,linux系统查看是多少位的命令
  7. JS动态模拟Form表单提交数据
  8. promise封装Ajax案例 淘宝猜你喜欢
  9. C# ASP.NET 解决方案开发微信公众号
  10. 一图明白OpenERP财务记账规则