IFilePromise arabirimini uygulamaAdobe AIR 2 ve üstü URLFilePromise nesnesi kullanılarak erişilemeyen kaynaklara dosya izni sağlamak için IFilePromise arabirimini özel bir sınıfta uygulayabilirsiniz. IFilePromise arabirimi, dosya izni bırakıldığında dosyaya yazılacak yazının AIR çalışma zamanı tarafından erişilebilmesi için kullanılan yöntem ve özellikleri tanımlar. Bir IFilePromise uygulaması, dosya izni için veri sağlayan başka bir nesneyi AIR çalışma zamanına iletir. Bu nesne, AIR çalışma zamanının veri okumak için kullandığı IDataInput arabirimini uygulamalıdır. Örneğin, IFilePromise uygulayan URLFilePromise sınıfı, veri sağlayıcı olarak URLStream nesnesi kullanır. AIR verileri senkronize olarak veya olmayarak okuyabilir. IFilePromise uygulaması isAsync özelliğine uygun değeri geri vererek hangi erişim modlarının desteklendiğini bildirir. Senkronize olmayan veri erişimi sağlanırsa, veri sağlayan nesne IEventDispatcher arabirimini uygulamalı ve open, progress, complete gibi gerekli olayları göndermelidir. Dosya iznine yönelik veri sağlayıcı olarak özel bir sınıf veya aşağıdaki yerleşik sınıflardan birini kullanabilirsiniz:
IFilePromise arabirimini uygulamak için, aşağıdaki işlevlere ve özelliklere yönelik kod sağlamalısınız:
Tüm IFilePromise yöntemleri çalışma zamanı tarafından dosya iznini içeren sürükle ve bırak işlemleri sırasında çağırılır. Genel olarak, uygulama mantığınız bu yöntemlerden herhangi birini doğrudan çağırmamalıdır. Bir dosya izninde senkronize olan veri sağlayıcısı kullanmaIFilePromise arabirimini kullanmanın en kolay yolu ByteArray veya senkronize FileStream gibi senkronize bir veri sağlayıcı nesne kullanmaktır. Aşağıdaki örnekte bir ByteArray nesnesi oluşturulur, veri ile doldurulur ve open() yöntemi çağırıldığında geri döndürülür. package { import flash.desktop.IFilePromise; import flash.events.ErrorEvent; import flash.utils.ByteArray; import flash.utils.IDataInput; public class SynchronousFilePromise implements IFilePromise { private const fileSize:int = 5000; //size of file data private var filePath:String = "SynchronousFile.txt"; public function get relativePath():String { return filePath; } public function get isAsync():Boolean { return false; } public function open():IDataInput { var fileContents:ByteArray = new ByteArray(); //Create some arbitrary data for the file for( var i:int = 0; i < fileSize; i++ ) { fileContents.writeUTFBytes( 'S' ); } //Important: the ByteArray is read from the current position fileContents.position = 0; return fileContents; } public function close():void { //Nothing needs to be closed in this case. } public function reportError(e:ErrorEvent):void { trace("Something went wrong: " + e.errorID + " - " + e.type + ", " + e.text ); } } } Uygulamada senkronize dosya vaatlerinin sınırlı kullanım alanı vardır. Veri miktarı az ise, kolaylıkla geçici dizinde bir dosya oluşturup, sürükle ve bırak panosuna normal dosya liste dizisi ekleyebilirsiniz. Diğer yandan, veri miktarı çoksa veya veriyi oluşturmak hesaplama açısından verimli değilse, uzun senkronize olan bir işlem gereklidir. Uzun senkronize işlemler kullanıcı arabirimi güncellemelerini belirli bir süre için engelleyebilir ve uygulamanızın yanıt vermiyormuş gibi görünmesine neden olabilir. Bu sorundan kaçınmak için, zamanlayıcı tarafından yönlendirilen ve senkronize olmayan bir veri sağlayıcısı oluşturabilirsiniz. Bir dosya izninde senkronize olmayan bir veri sağlayıcısı kullanmaSenkronize olmayan bir veri sağlayıcı nesnesi kullandığınızda IFilePromiseisAsync özelliği true olmalı ve open yöntemiyle dönen nesne IEventDispatcher arabirimini uygulamalıdır. Yerleşik nesnelerin veri sağlayıcısında kullanılabilmesi için çalışma zamanı çeşitli alternatif olayları dinler. Örneğin, progress olayları FileStream ve URLStream nesneleri tarafından gönderilirken, socketData olayları Socket nesneleri tarafından gönderilirler. Çalışma zamanı tüm bu nesneler için uygun olayları dinler. Aşağıdaki olaylar, veri sağlayıcı nesnesinden veri okuma işlemini yürütür:
Veri sağlayıcı bu olayları aşağıdaki sırada göndermelidir:
Not: Hazır nesneler, FileStream, Socket ve URLStream uygun olayları otomatik olarak gönderir.
Aşağıdaki örnek, özel, senkronize olmayan veri sağlayıcısı kullanarak dosya izni oluşturur. Veri sağlayıcı sınıfı ByteArray öğesini genişletir (IDataInput desteği için) ve IEventDispatcher arabirimini uygular. Her zamanlayıcı olayında, nesne bir yığın veri oluşturur ve çalışma zamanına verinin geçerli olduğunu haber vermek için ilerleme olayı gönderir. Yeterli veri oluşturulduğunda, nesne tamamlanmış bir olay gönderir. package { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.events.ProgressEvent; import flash.events.TimerEvent; import flash.utils.ByteArray; import flash.utils.Timer; [Event(name="open", type="flash.events.Event.OPEN")] [Event(name="complete", type="flash.events.Event.COMPLETE")] [Event(name="progress", type="flash.events.ProgressEvent")] [Event(name="ioError", type="flash.events.IOErrorEvent")] [Event(name="securityError", type="flash.events.SecurityErrorEvent")] public class AsyncDataProvider extends ByteArray implements IEventDispatcher { private var dispatcher:EventDispatcher = new EventDispatcher(); public var fileSize:int = 0; //The number of characters in the file private const chunkSize:int = 1000; //Amount of data written per event private var dispatchDataTimer:Timer = new Timer( 100 ); private var opened:Boolean = false; public function AsyncDataProvider() { super(); dispatchDataTimer.addEventListener( TimerEvent.TIMER, generateData ); } public function begin():void{ dispatchDataTimer.start(); } public function end():void { dispatchDataTimer.stop(); } private function generateData( event:Event ):void { if( !opened ) { var open:Event = new Event( Event.OPEN ); dispatchEvent( open ); opened = true; } else if( position + chunkSize < fileSize ) { for( var i:int = 0; i <= chunkSize; i++ ) { writeUTFBytes( 'A' ); } //Set position back to the start of the new data this.position -= chunkSize; var progress:ProgressEvent = new ProgressEvent( ProgressEvent.PROGRESS, false, false, bytesAvailable, bytesAvailable + chunkSize); dispatchEvent( progress ) } else { var complete:Event = new Event( Event.COMPLETE ); dispatchEvent( complete ); } } //IEventDispatcher implementation public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { dispatcher.addEventListener( type, listener, useCapture, priority, useWeakReference ); } public function removeEventListener(type:String, listener:Function, useCapture:Boolean=false):void { dispatcher.removeEventListener( type, listener, useCapture ); } public function dispatchEvent(event:Event):Boolean { return dispatcher.dispatchEvent( event ); } public function hasEventListener(type:String):Boolean { return dispatcher.hasEventListener( type ); } public function willTrigger(type:String):Boolean { return dispatcher.willTrigger( type ); } } } Not: Çünkü örnekteki AsyncDataProvider sınıfı ByteArray öğesini genişlettiği için, EventDispatcher öğesini de genişletebilir. IEventDispatcher arabirimini uygulamak için, sınıf, dahili EventDispatcher nesnesini kullanır ve IEventDispatcher yöntemi çağrılarını dahili nesneye yönlendirir. EventDispatcher öğesini de genişletebilir ve IDataInput öğesini uygulayabilirsiniz (veya her iki arabirimi de uygulayabilirsiniz).
Senkronize olmayan IFilePromise uygulaması senkronize olan uygulamayla aynıdır. Temel farklar isAsync öğesinin true değerini döndürmesi ve open() yönteminin senkronize olmayan bir veri nesnesini döndürmesidir: package { import flash.desktop.IFilePromise; import flash.events.ErrorEvent; import flash.events.EventDispatcher; import flash.utils.IDataInput; public class AsynchronousFilePromise extends EventDispatcher implements IFilePromise { private var fileGenerator:AsyncDataProvider; private const fileSize:int = 5000; //size of file data private var filePath:String = "AsynchronousFile.txt"; public function get relativePath():String { return filePath; } public function get isAsync():Boolean { return true; } public function open():IDataInput { fileGenerator = new AsyncDataProvider(); fileGenerator.fileSize = fileSize; fileGenerator.begin(); return fileGenerator; } public function close():void { fileGenerator.end(); } public function reportError(e:ErrorEvent):void { trace("Something went wrong: " + e.errorID + " - " + e.type + ", " + e.text ); } } } |
|