import {DataContentEnum} from '../../common/lang/DataContentEnum'; import {ListenerContext} from '../../common/lang/ListenerContext'; import {ObjectUtil} from '../../common/lang/ObjectUtil'; import {Objects} from '../../common/lang/Objects'; import {ScopeEnum} from '../../common/lang/ScopeEnum'; import {HttpConnection} from '../../common/net/HttpConnection'; import {ClassUtil} from '../../common/reflect/ClassUtil'; import {Linker} from '../../common/reflect/Linker'; import {Service} from '../Service'; import {HttpService} from './HttpService'; import {JsonService} from './JsonService'; import {ListenerThread} from './ListenerThread'; import {Loader} from './Loader'; import {ThreadService} from './ThreadService'; //========================================================== // 日志控制台。 // // @class // @author maocy // @version 150729 //========================================================== export class LoaderService extends Service { // 加载集合 protected _loaders: Objects; // 加载中集合 protected _processLoaders: Objects; // 加载上限 protected _processLimit: number; // 线程 protected _thread: ListenerThread; // 间隔 protected _interval: number; // 线程控制台 @Linker(ThreadService) protected _threadConsole: ThreadService; // 请求控制台 @Linker(HttpService) protected _httpConsole: HttpService; // JSON控制台 @Linker(JsonService) protected _jsonConsole: JsonService; //========================================================== // 构造处理。 //========================================================== public constructor() { super(); // 设置属性 this._scopeCd = ScopeEnum.Global; this._processLimit = 8; this._interval = 150; this._loaders = new Objects(); this._processLoaders = new Objects(); // 创建线程 var thread: ListenerThread = this._thread = ClassUtil.create(ListenerThread); thread.interval = this._interval; thread.processListeners.register(this, this.onProcess); this._threadConsole.start(thread); } //========================================================== // 逻辑处理。 //========================================================== public onProcess() { var loaders: Objects = this._loaders; var processLoaders: Objects = this._processLoaders; var httpConsole: HttpService = this._httpConsole; var jsonConsole: JsonService = this._jsonConsole; //.......................................................... // 获取数据 var processCount: number = processLoaders.count(); if (!loaders.isEmpty()) { for (var n: number = this._processLimit - processCount; n > 0; n--) { var loader: Loader = loaders.shift(); var url: string = loader.url; // 加载处理 var connection: HttpConnection = null; if (loader.contentCd == DataContentEnum.Json) { connection = jsonConsole.sendAsync(url); } else { connection = httpConsole.sendAsync(url); } connection.loadListeners.register(this, this.onLoad, loader); // 增加加载中集合 processLoaders.push(loader); // 跳出循环 if (loaders.isEmpty()) { break; } } } } //========================================================== // 加载事件完成后,响应的处理。 // // @method // @param connection:FHttpConnection 链接 //========================================================== public onLoad(sender: ListenerContext, event: any): void { // 设置资源 var loader: Loader = sender.attributes[0]; loader.data = event.content; loader.process(); // var resource = event.connection._resource; // // 加载数据 // var storage = RClass.create(FResourceSingleStorage); // storage.setResource(resource); // storage.load(data); // // 加载资源存储块集合 // RConsole.find(FResourceDataConsole).load(storage); // 移除加载中 //this._loadingResources.remove(resource); this._processLoaders.remove(loader); } //========================================================== // 链接处理。 // // @method //========================================================== public push(loader: Loader) { this._loaders.push(loader); } //========================================================== // 释放处理。 //========================================================== public dispose() { // 释放属性 this._loaders = ObjectUtil.dispose(this._loaders); // 父处理 super.dispose(); } }