Android消息机制源码解析(四)——消息队列MessageQueue

MessageQueue是Android消息机制系列文章的最后一个小节,MessageQueue的主要作用是按一定规则维护一个消息队列,并能够添加消息、取出消息、移除消息等。

阅读更多

Android消息机制源码解析(三)——消息循环器Looper

本节来分析Looper,Looper可以理解为一个消息循环器,不断从消息队列中取出消息,然后交给Handler处理。如果一个线程中有多个Handler,则会根据Message的target属性来将消息处理任务分发到特定的Handler。如果消息队列中没有消息了,那么Looper就会等待,直到有消息进来,下面看一下Looper的源码实现。

阅读更多

Android消息机制源码解析(二)——消息执行者Handler

这一节来分析Handler的源码实现,Handler从字面理解就是处理程序、处理器的意思,在Android消息机制中它扮演着执行者的角色,消息的发送、接收、处理都是由Handler来完成的,它也是跟开发者打交道最多的,因此我们更有必要深入了解Handler的实现原理。

阅读更多

Android消息机制源码解析(一)——消息载体Message

说到Android的消息机制,大家再熟悉不过了,几乎每个逻辑界面中都会涉及到,Activity的生命周期回调也是通过系统消息机制完成的,可见消息机制在Android中的重要性。在应用层,一般我们都是使用Handler来发送、处理消息,从工作线程切换到主线程来更新UI。往往开发者只跟Handler、Message打交道就能满足需求了,但它们背后的实现原理是怎样的呢?为了加深理解,深入学习Android设计理念,同时也希望给初学者带来一些帮助,下面会从源码角度来分析Android的消息机制,鉴于篇幅原因,大致分为如下四个小节:

阅读更多

潜心做一名花匠

中秋佳节,上海却迎来了狂风暴雨,既然无法赏月,那就坐在书桌前,静静地品一杯茶吧。

阅读更多

Java内存分配策略——《深入理解Java虚拟机》笔记

概述

Java自动内存管理包含两方面的含义:给对象分配内存以及回收分配给对象的内存。

阅读更多

垃圾收集器与常用垃圾收集算法

概述

垃圾收集器(Garbage Collection, GC)的历史要比Java久远,且并非Java独有,GC主要完成以下三件事情:

阅读更多

深入理解Java对象克隆

简单的对象拷贝

在应用开发中,有时候需要得到一个对象的副本,然后对该副本做一些修改而不影响原始对象,可能大家会想到像下面示例中这样做。

阅读更多

Java内存模型——《深入理解Java虚拟机》笔记

Java内存模型概述

Java运行在JVM上,通常说的Java内存模型是指在Java虚拟机上的内存分配模型。

阅读更多

从一个崩溃再谈Context

异常信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
AndroidRuntime: FATAL EXCEPTION: main Process: com.aspook.contexttest, PID: 22578
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ContextImpl.startActivity(ContextImpl.java:672)
at android.app.ContextImpl.startActivity(ContextImpl.java:659)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:331)
at android.widget.TextView.shareSelectedText(TextView.java:9493)
at android.widget.TextView.onTextContextMenuItem(TextView.java:9211)
at android.widget.Editor$TextActionModeCallback.onActionItemClicked(Editor.java:3249)
at com.android.internal.policy.PhoneWindow$DecorView$ActionModeCallback2Wrapper.onActionItemClicked(PhoneWindow.java:3540)
at com.android.internal.view.FloatingActionMode$3.onMenuItemSelected(FloatingActionMode.java:85)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.FloatingActionMode$4.onMenuItemClick(FloatingActionMode.java:111)
at com.android.internal.widget.FloatingToolbar$FloatingToolbarMainPanel$1.onClick(FloatingToolbar.java:1015)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21155)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

阅读更多