Libgdx学习笔记:分享自己写的异步加载
2019独角兽企业重金招聘Python工程师标准>>>
从需求说起:
解析xml,json文件等耗时的操作,如果放到绘制线程,或者初始化里面,会导致画面卡顿一下,让人看起来不爽,这时候就想能不能异步加载一下。
查看Libgdx的AssetManager发现里面用到了AsyncExecutor,AsyncTask,AsyncResult相关异步线程池。
简单介绍下:
【AsyncExecutor】
在一个独立的线程里面,异步执行AsyncTask实例。不需要使用的时候,调用dispose()进行释放。
看内部源码,实际使用了java的线程池Executors.newFixedThreadPool来管理的。
简单说是处理AsyncTask的容器。
【AsyncTask】为接口,可根据实际情况实现成自己的Task。
提交任务给一个AsyncExecutor,返回类型为T的结果。
【AsyncResult】
AsyncExecutor.submit(AsyncTask)返回的结果。
isDone()方法,代表任务是否处理完毕。
=================================================================
上代码:
CHAsyncTask 抽象任务类
CHAsyncManager异步管理中心,最好放在Game里面初始化一次,并且在render()中调用update()方法。
通过循环的检测AsyncResult,来查看异步任务是否被执行完毕。
简单说:我们到蛋糕店,订了一块蛋糕,老板给了你一个提货单,然后让后厨加紧做蛋糕,这时,你让小明每隔半小时拿着提货单到蛋糕店去查看,蛋糕做好了吗。如果做好了,你就拿回来。
这个期间你完全可以去做其他事情,而不必一直在等待。
做蛋糕=》CHAsyncTask
提货单=》AsyncResult
小明=》Game中的render()
public abstract class CHAsyncTask implements AsyncTask<String> {private CHAsyncManager asyncManager;// 处理结果private AsyncResult<String> depsFuture = null;// 处理OK?volatile boolean asyncDone = false;public CHAsyncTask() {}public CHAsyncTask(CHAsyncManager manager) {asyncManager = manager;}@Overridepublic String call() throws Exception {// 执行任务String result = doInBackground();asyncDone = true;return result;}/**开始执行*/public abstract void onPreExecute();/**执行结束返回结果*/public abstract void onPostExecute(String result);/**异步执行*/public abstract String doInBackground();// public boolean update() {if (!asyncDone) {//没有执行完成if (depsFuture == null) {// 也没有提交任务,进行提交onPreExecute();depsFuture = asyncManager.getExecutor().submit(this);}} else {if (depsFuture.isDone()) {// 通过结果发现执行完毕了try {onPostExecute(depsFuture.get());} catch (Exception e) {throw new GdxRuntimeException("depsFuture.get() failed!!!!");}}}return asyncDone;}public void setAsyncManager(CHAsyncManager asyncManager) {this.asyncManager = asyncManager;}public CHAsyncManager getAsyncManager() {return asyncManager;}/*** * <pre>* 是否执行完毕* * date: 2015-1-18* </pre>* @author * @return*/public boolean isDone() {return asyncDone;}
}
public class CHAsyncManager implements Disposable {// 任务堆栈private final Stack<CHAsyncTask> tasks = new Stack<CHAsyncTask>();private AsyncExecutor executor;public CHAsyncManager() {// 池中允许的最大线程数1。超过最大上限会等待前面的执行完才接着执行。executor = new AsyncExecutor(1);}public boolean update() {if (tasks.size() == 0)return true;return updateTask() && tasks.size() == 0;}private boolean updateTask() {//任务更新情况CHAsyncTask task = tasks.peek();if (task.update()) {// 处理完毕了,移除掉tasks.pop();return true;}return false;}/***预先加载任务*/public void loadTask(CHAsyncTask task) {if (task.getAsyncManager() == null) {task.setAsyncManager(this);}tasks.push(task);}@Overridepublic void dispose() {executor.dispose();}public AsyncExecutor getExecutor() {return executor;}}
转载于:https://my.oschina.net/oahcfly/blog/369432
Libgdx学习笔记:分享自己写的异步加载相关推荐
- atomQQ 笔记 之 列表元素的异步加载
在list当中,如果自定义item中的内容是从网络获取的,并且要求较高的实时性,那么就需要异步加载,这样,只需要显示在屏幕上的item以及即将被显示的item去获取网络资源,不至于对网络访问占用很大的 ...
- scrapy学习笔记(三)-关于动态加载网页的爬取(序)
一.尝试 对于我要爬取的网站内容,按照网上普遍的步骤:直接通过xpath获取到对于数据,再记录到item中,只适用于静态html网页,但是如今的互联网大部分的web页面都是动态的,经常逛的网站例如京东 ...
- JVM学习笔记之-类加载子系统,类的加载与类的加载过程,双亲委派机制
一 类加载器与类加载过程 类加载子系统作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识. ClassLoader只负责class文件的加载,至于 ...
- Objective-C学习笔记第十五章文件加载与保存
第十五章文件加载与保存 Cocoa提供了Core Data,他能在后台处理所有文件内容 Cocoa提供了两个通用的文件处理类:属性列表和对象编码 一.属性列表类 在Cocoa中,有一类名为属性列表的对 ...
- 深度实践SPARK机器学习_学习笔记_第二章2.3加载数据
2.3加载数据 1.下载数据文件u.user head -3 u.user ##查看文件前几行 cat u.user |wc -l 或者 more u.user |wc -l ##数文件记录数 ...
- Unity学习笔记(5):动态加载Prefab
第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...
- contiki学习笔记(六)contiki程序加载器和多线程库
六.contiki程序加载器 contiki程序加载器是一个用于加载和启动程序的抽象接口. Data Structures struct dsc//DSC程序描述结构. ModulesThe Cont ...
- 浅谈Android中的异步加载之ListView中图片的缓存及优化三
隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算 ...
- turn.js异步加载实现翻书效果
<div class="m-art-cont"><script type="text/javascript" src="/Runti ...
最新文章
- css新闻列表优化-突破思维新方法更利于搜索引擎
- 【iOS UI】iOS 9 GUI 资源分享
- Git查看、删除、重命名远程分支和tag【转】
- Arcgis Server Manager发布ArcGISTiledMapServiceLayer服务
- rocksdb和leveldb性能比较——写性能
- 线性代数之行列式矩阵术语中英对照
- oracle awr 数据删除,Oracle AWR 删除历史快照 说明【转自dave偶像大神】
- Linux系统编程——僵尸的模拟以及僵尸进程的预防
- oracle重新生成控制文件,Oracle重建控制文件的语法
- MP4Box获取MP4媒体文件的播放时长
- 两台电脑直接使用一根网线传输文件
- html 页眉选项卡,连续两个奇数页页眉 再选择插入菜单——分页,执行2次
- 【基础篇】SpringBoot 自定义 Banner
- 什么是RSS?RSS是什么
- (2) [保护模式]段描述符
- tab weui 页面切换_weui 多网页切换效果分析
- LiveNVR安防摄像头Web无插件直播平台页面的快速集成方法
- 什么软件去视频水印 拍抖音技巧视频教程
- 春招来了!找个互联网IT工作试试看?2021校招公司大全!
- 机器人/人工智能/就业形势2023