随笔分类 -  Android

安卓开发学习
Android内存泄漏的场景 (1)
摘要:场景一:匿名内部类、非静态内部类 隐式持有外部类的引用 非静态内部类示例 如19-20行所示,在外部类外实例化非静态内部类时,需要通过外部类的实例.new进行构造。 使用 javac Test.java进行编译,生成Test$Outer$Inner.class、Test$Outer.class、Te 阅读全文
posted @ 2017-11-02 16:19 游不动の鱼 阅读(242) 评论(0) 推荐(0)
EventBus3.0源码学习(4) threadMode
摘要:线程模式 POSTING:该模式不需要线程切换,为默认模式。在post线程直接调用事件订阅函数。 MAIN:若post线程是主线程,则与POSTING模式一样;否则,由mainThreadPoster进行处理,从主线程调用事件订阅函数。 BACKGROUND:若post线程不是主线程,则与POSTI 阅读全文
posted @ 2017-10-20 11:51 游不动の鱼 阅读(957) 评论(0) 推荐(0)
EventBus3.0源码学习(3) SubscriberMethodFinder
摘要:订阅函数查找 当一个对象调用register向EventBus注册时,查找对象中所有接收订阅事件的函数被封装在SubscriberMethodFinder类中。findSubscriberMethods的实现如下: 若ignoreGeneratedIndex为true,则调用findUsingRef 阅读全文
posted @ 2017-10-19 16:04 游不动の鱼 阅读(542) 评论(0) 推荐(0)
EventBus3.0源码学习(2) post
摘要:发送事件(post) 当需要发送事件时,调用EventBus.getDefault().post(event)即可,EventBus会将事件发送给所有已经注册了监听该类事件的订阅者。post的实现如下: 第2-4行,currentPostingThreadState是ThreadLocal<Post 阅读全文
posted @ 2017-10-18 11:32 游不动の鱼 阅读(412) 评论(0) 推荐(0)
EventBus3.0源码学习(1) register和unregister
摘要:引子 EventBus提供了一套完善的总线机制,能有效地用于模块间解耦。要使用EventBus,在项目模块的build.gradle中添加如下依赖即可: 类定义 注册(register) 当一个对象想要从EventBus接收事件时,只需在EventBus中进行注册自己,调用EventBus.getD 阅读全文
posted @ 2017-10-17 18:04 游不动の鱼 阅读(1428) 评论(0) 推荐(0)
Android源码学习(4) Handler之ThreadLocal
摘要:线程的threadLocals Looper通过sThreadLocal来设置线程与Looper的对应关系,sThreadLocal是范型类ThreadLocal<Looper>的实例,其添加、移除元素的操作如下: 从代码中可以看出,Looper对象实际上是被添加到当前线程的本地数据表中(t.thr 阅读全文
posted @ 2017-10-14 23:25 游不动の鱼 阅读(1414) 评论(0) 推荐(0)
Android源码学习(3) Handler之MessageQueue
摘要:消息出队 MessageQueue封装了以单向列表实现的Message队列。在Looper循环中,通过调用MessageQueue的next()方法将队首元素出队进行处理: 当队首元素执行时间未 或 队首元素为SyncBarrier且队列中没有asynchronous的Message 或 队列为空时 阅读全文
posted @ 2017-10-12 20:08 游不动の鱼 阅读(452) 评论(0) 推荐(0)
Android源码学习(2) Handler之Looper
摘要:Looper准备 Handler实例化时,会从当前线程获取Looper,从而获得MessageQueue,用于发送消息。然而,线程不是生来就有Looper对象的,需要在线程执行中调用静态方法Looper.prepare(),最终会调用到如下静态方法: 静态变量sThreadLocal是范型类Thre 阅读全文
posted @ 2017-10-12 12:06 游不动の鱼 阅读(294) 评论(0) 推荐(0)
Android源码学习(1) Handler
摘要:Handler的实例化 在安卓开发中,经常会用到Handler将任务提交到指定线程(例如主线程)去执行或者让其延迟执行。Handler的构造函数有多种重载形式,但最终都调用到如下两种之一: 可以看到:这两个构造函数的区别只是Looper的获取方式不一样,当未指定Looper时,Handler内部会通 阅读全文
posted @ 2017-10-08 22:55 游不动の鱼 阅读(402) 评论(0) 推荐(0)
安卓下多线程OpenGL共享Context (四)
摘要:之前的方案假定Java层更新纹理时使用的是RGB或RBGA格式的数据,但是在播放视频这种应用场景下,解码器解码出来的数据如果是YUV格式,渲染起来就比较麻烦了。一种方式是使用CPU进行YUV转RGB,然后再进行渲染,但是这种方式性能极差;另一种方式是使用GPU进行转换,利用GPU的并行计算能力加速转 阅读全文
posted @ 2017-07-10 16:54 游不动の鱼 阅读(3644) 评论(0) 推荐(0)
安卓下多线程OpenGL共享Context (三)
摘要:在上一节中我们介绍了多线程OpenGL绘制方案,但是如果需要在Java线程不断修改纹理数据,会由于并发访问导致Unity线程出现访问非法内存而崩溃。因此,考虑在Java线程加载数据,然后在unity线程调用OpenGL操作更新纹理。这样所有的OpenGL操作都在Unity绘制线程完成,从而避免了多线 阅读全文
posted @ 2017-05-30 12:18 游不动の鱼 阅读(2298) 评论(1) 推荐(0)
安卓下多线程OpenGL共享Context (二)
摘要:为了在Java线程进行OpenGL调用,需要为java线程初始化OpenGL环境,initOpenGL函数展示了初始化OpenGL环境的过程。在setupOpenGL方法中,在线程上先执行该调用即可。Java代码示例如下: 初始化完OpenGL环境之后,就可以在Java线程中愉快地进行OpenGL调 阅读全文
posted @ 2017-05-25 10:48 游不动の鱼 阅读(7874) 评论(0) 推荐(0)
安卓下多线程OpenGL共享Context (一)
摘要:最近在研究Unity3D开发中使用Java Plugin进行纹理更新,想法很简单,在Java线程更新纹理数据,然后Unity场景中的纹理将自动更新。 首先,创建Java类,定义创建纹理及获取纹理参数的接口,并创建单线程池用于进行加载Bitmap并绑定纹理数据等OpenGL操作。Java代码示例: 然 阅读全文
posted @ 2017-05-23 11:41 游不动の鱼 阅读(2806) 评论(0) 推荐(0)
Adding Action Buttons
摘要:为简单起见,此处只保留了关键代码。详细过程参见官方教程:Adding Action Buttons在AndroidManifest.xml文件中,我们有如下代码: ... 阅读全文
posted @ 2015-02-03 22:15 游不动の鱼 阅读(210) 评论(0) 推荐(0)
Starting Another Activity
摘要:为简单起见,此处只保留了关键代码。详细过程参见官方教程:Starting Another Activity在MainActivity类中,我们有如下代码:public final static String EXTRA_MESSAGE = "com.example.simon.myapplicati... 阅读全文
posted @ 2015-01-30 22:07 游不动の鱼 阅读(198) 评论(0) 推荐(0)