图库中的线程交互

为什么要单开一章讲这个GLThread?因为图库使用了GLSurfaceView,GLSurfaceView内部的GLThread线程负责当前GLSurfaceView的OpenGL描绘,这样图库里就有了我们编码必须要面对的多线程环境;我们在编码时,如果不注意多线程带来的竞争,很可能出现Null Pointer Exception(简称NPE),编码时有这方面的保护意识可以减少很多APR问题;
图库针对多线程环境,设计了一套比较安全的机制,我们编码只要遵循这个机制,由多线程带来的问题可以得到最大限度地减少,下面我们来介绍这个机制。
1图库主要线程交互流程
我们在 OpenGL描绘及其事件分发 一章中介绍GLRootView的每一帧回调(onDrawFrame)都是源自GLRootView父类GLSurfaceView内部GLThread的run()方法,那么GLView的render方法必定是在GLThread线程得到执行的;
我们又知道Android的事件响应、标准View的绘制都是在主线程(main线程)中调用;
图库中数据加载是在后台线程中执行的,缩略图是通过线程池中的线程获取的;

图库中主要线程及其交互如下图:
在这里插入图片描述
后台线程ReloadTask、线程池中的线程加载数据、缩略图、Flag、地点等完成后通过主线程的Handler将这些数据抛到主线程,让主线程处理这些加载好的数据;
主线程在处理这些数据时,必须要先获取锁,然后再更新这些被GLThread访问的变量,更新完成后释放之前获取的锁;
GLThread在描绘时,也必须要先获取锁,然后再执行具体的描绘工作,描绘完成后释放掉这把锁;

按照上述设计,GLSurfaceView在每一

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/102669425
今日推荐