如何在android中执行on applicationpause on once

我们知道线程是进程中某个单┅顺序的控制流,它是内核做CPU调度的单位那何为Looper线程呢?所谓Looper线程即是借助于Looper和MessageQueue来管理控制流的一类线程。在android系统中application的主线程即是借助于Looper和MessageQueue来管理控制流的。其实不仅仅只有主线程可以用Looper和MessageQueue来管理控制流,其他的线程也一样可以我们可以先看一下android

可以看到,就是茬线程的run()方法中调用Looper.prepare()做一些初始化,然后创建一个Handler对象最后执行Looper.loop()即开始了整个的事件循环。就是这么的简单一个可以使用消息队列來管理线程执行流程的Looper 线程就创建好了。

接着我们来看一下神秘的Looper.prepare()到底都干了些什么事情:

可以看到,它做的事情就是为当前的线程创建了一个Looper对象并存储在一个静态的线程局部变量中。在Looper的构造函数中创建了MessageQueue同时Looper会引用到当前的线程,并将一个表示状态的变量mRun设置為true对于此处的线程局部变量sThreadLocal,可以理解为就是一个HashMap该HashMap中存放的数据其类型为Looper,而HashMap的key则Thread.currentThread()

启动Looper线程就和启动普通的线程一样,比如:

同樣是new一个Thread对象然后执行该对象的start()方法。

比较特别的地方即在于此处调用prepare()方法传进去的参数为false,即表示这个Looper不能够被quit掉其他倒是基本┅样。整个android系统中调用到prepareMainLooper()方法的大概有两处:

通过消息与Looper线程交互

那Looper线程的特别之处究竟在哪里呢?如前所述这种线程有一个Looper与之关聯,这种线程会使用消息队列或者称为事件循环来管理执行的流程。那这种特别之处又如何体现呢其他线程可以向此类线程中丢消息進来,当然此类线程本身也可以往自己的消息队列里面丢消息然后在事件循环中,这种事件会得到有效的处理那究竟要如何往Looper线程的消息队列中发送消息呢?

回忆我们前面创建Looper线程的那个code我们不是有创建出来一个Handler嘛。没错我们就是通过Handler来向Looper线程的MessageQueue中发送消息的。可鉯看一下code的写法先是LooperThread的写法:

然后是向Looper线程发送消息的部分的写法:

Handler究竟是如何知道要向哪个MessageQueue中发送消息呢,从前面的code中我们找不到任何将Handler与特定的MessageQueue关联起来的代码,这究竟是怎么回事呢这也是我们强调要使用Looper线程中创建的Handler对象来向该Looper线程中发送消息的原因。我们可鉯看一下Handler对象构造的过程:

可以看到很简单,是通过Looper.myLooper()获取到当前线程的Looper对象并与相关的MessageQueue等关联起来的。这也是前面我们在实现Looper线程时要在其run方法中创建一个public的Handler的依据。当然我们也可以在构造Handler对象时,显式地使其与特定的Looper对象关联起来

Handler实际的职责,并不像它的名称所显示的那样其实它不仅仅是处理message,它还负责发送Message给线程的MessageQueue

整个将Message放入MessageQueue的算法也还算比较清晰简洁,并没有什么太绕的地方此处我們可以一览MessageQueue中保存Messages的结构,即MessageQueue用一个单向链表来保存所有的Message,而链表中各个Message则按照其请求的执行时间先后来排列

消息队列中的消息是茬Looper.loop()中被处理的:

很简单的一个方法。可见post的消息的特殊之处即,此类消息将完全绕过Handler中用于处理消息的 handleMessage() 方法而只会执行消息的sender所实现嘚Runnable。

还有一个问题当MessageQueue中没有Messages时,那Looper线程会做什么呢它会去不停的轮询消息队列中是否有消息吗?计算机科学发展到现在闭上眼睛我們都能知道,Looper线程将一定不会去轮询的也确实,android消息队列机制的实现同样是会在消息队列为空时,让Looper线程去休眠当消息队列中有了消息之后,再被唤醒但这样的机制又是如何实现的呢?

我们从Sleep-Wakeup机制所需设施的建立开始看起回忆前面我们看到的Looper的构造函数,它会创建出来一个MessageQueue对象而Sleep-Wakeup机制所需设施正是在MessageQueue对象的创建过程中创建出来的。我们接着再来看MessageQueue的构造函数:

关于pthread库提供的线程局部存储API的用法可以看到,每个线程局部存储对象都需要一个key,通过pthread_key_create()函数创建随后各个线程就可以通过这个key并借助于pthread_setspecific()和pthread_getspecific()函数来保存或者获取相应的線程局部存储的变量了。再来看Looper的构造函数它创建了一个pipe,两个文件描述符然后设置管道的两个文件描述属性为非阻塞I/O。接着是创建並设置epoll实例由此我们了解到,android的消息队列是通过epoll机制来实现Sleep-Wakeup机制的

然后来看当其他线程向Looper线程的MessageQueue中插入了消息时,Looper线程是如何被叫醒的回忆我们前面看到的MessageQueue类的enqueueMessage()方法,它在最后插入消息之后有调用一个nativeWake()方法。没错正是这个nativeWake()方法执行了叫醒Looper线程的动作。那它又是洳何叫醒Looper线程的呢来看它的实现:

它所做的事情,就是向管道的用于写的那个文件中写入一个“W”字符而已

接着是Looper线程休眠的过程。峩们知道Looper线程在Looper.loop()方法中,将会不断地从MessageQueue中取出消息并处理。不难想象休眠的时机应该是在取出消息的时候。由Looper.loop()方法的code我们知道,咜是通过MessageQueue.next()方法来从消息队列中取出消息的我们来看MessageQueue.next()方法的实现:

google被和谐后,通过vpn或者访问上述鏡像路径

replace这个方法在fragment内部直接代入布局的id是不会有问题的,但是在外部比如Activitiy中用就会出现fragment叠加的问题 有很多人说给每个fragment设置背景色或圖片,但是我觉得额外费资源 其实只要改成这样就好了,但这之中的原理又有谁懂呢

加填充xml文件时,TextView是隐藏的但又想在xml中直观的看箌它显示后的整体效果.借助xmlns:tools="" 完美实现.

变量放在主存区上,使用该变量的每个线程都将从主存区拷贝一份到自己的工作区上进行操作。
volatile, 声明这个字段易变(可能被多个线程使用)Java内存模型负责各个线程的工作区与主存区的该字段的值保持同步,即一致性
static, 声明这个字段是静态的(可能被多个实例共享),在主存区上该类的所有实例的该字段为同一个变量即唯一性。
volatile, 声明变量值的一致性;static,声明变量的唯一性
此外,volatile同步机制不同于synchronized, 前者是内存同步后者不仅包含内存同步(一致性),且保证线程互斥(互斥性)
static 只是声明变量在主存仩的唯一性,不能保证工作区与主存区变量值的一致性;除非变量的值是不可变的即再加上final的修饰符,否则static声明的变量不是线程安全嘚。
295.ids的作用和使用场景

作用:通过ids.xml中事先定义好id在使用时候不用重新生成对应的id,提高性能和可维护性优化编译效率。统一管理资源Id eg:如果没有ids.xml中定义。在layout文件中声明方式如下@+id/xxx 如果定义过,使用方式如下@id/xxx 即不用加"+"号 使用场景,对于需要同意管理资源id的场景比如框架id 参考

296.音乐领域,什么是EQ

EQ就是均衡器equalizer的缩写。在高级一点的混音器上都会有EQ的调整钮。一般来说EQ调整的都是音轧的播放的高音量(terble)、中音(middle)、以及重音(bass)的音乐频变化


如果是想在动画执行完成之后,执行某些操作可以通过如下方式

使用sql 语句中,如果有字符串必須加上 ‘ ‘单括号 括起来

 
一、升级版本到4.2.2

 这是一篇很好的文章!!! 目前很多应用都用webview加载H5页面,如果服务端采用的是可信CA颁发的证书茬webView.setWebViewClient(webviewClient)时重载WebViewClient的onReceivedSslError(),如果出现证书错误直接调用handler.proceed()会忽略错误继续加载证书有问题的页面,如果调用handler.cancel()可以终止加载证书有问题的页面证书出现問题了,可以提示用户风险让用户选择加载与否,如果是需要安全级别比较高可以直接终止页面加载,提示用户网络环境有风险:  不建议直接用handler.proceed()聚安全的应用安全扫描器会扫出来直接调用handler.proceed()的情况。 如果webview加载https需要强校验服务端证书可以在onPageStarted()中用HttpsURLConnection强校验证书的方式来校验垺务端证书,如果校验不通过停止加载网页当然这样会拖慢网页的加载速度,需要进一步优化具体优化的办法不在本次讨论范围,这裏也不详细讲解了

需要在客户端中预埋证书文件,或者将证书硬编码写在代码中

正确使用HTTPS并非完全能够防住客户端的Hook分析修改要想保證通信安全,也需要依靠其他方法比如重要信息在交给HTTPS传输之前进行加密,另外实现客户端请求的签名处理保证客户端与服务端通信請求不被伪造


无法注册应用程序: 已到超时限制
}

404 - 存储库不存在或没有读访问权限

返回图像的低级信息 name

404 - 没有这样的形象

将图像标记name到存储库中

404 - 没有这样的容器

通过流媒体实时从docker获取容器事件

Docker容器报告以下事件:

Docker镜像报告以下事件:

Docker卷报告以下事件:

Docker网络报告以下事件:

Docker守护程序报告以下事件:

阅读此作者的更多帖子。

Jedis异常汇总(持续更新)

一.无法从连接池获取到Jedis连接

保持最新!将所有最新且最好的帖子直接发送到您的收件箱

}

我要回帖

更多关于 pause on once 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。