AIR:让Adobe AIR 程序离线运行空気:空気の手続きをオフラインでの操作はAdobe
07月12th, 2007 — Dreamer 07月12日、 2007年-ドリーマー写在前面: 好久没有翻译东西了,一个原因是自己没什么时间,天天忙着背单词、看数学,每天上网的时候也忙着看新闻,有时候想要翻译一篇却找不到感觉,一点效率也没有,想当初看到一篇教程就复制到Word里,然后打开金山词霸和Google翻译,一段一段循序渐进,两个小时就搞定一篇,搞定之后的一段时间内就感觉人生充实,大好年华没有虚度。社説:特定のことを翻訳に長い時間、その理由は、自分のわずかな時間、毎日忙しく先頭の言葉は、数学、一日を読むときに、インターネットのニュースも忙しく、時にはを見つけることができませんに翻訳するような感じがしたい効率性ではない、希望のチュートリアルを表示するにはオリジナルのコピーをWordを開いてkingsoftと、 Googleの翻訳は、セクションでは、期間を段階的かつ秩序ある進展、 2つの時間を取得するには、期間内に取得した後、豊かな生活を感じ、良い年齢が無駄になる。 另外一个原因就是国外那些Flexer写的精品教程也少了很多,Kuwamoto好久不写了,Matt Chotin好久不写了,Peter Ent也不经常更新,不像以前,那是一篇接着一篇啊,我翻译起来也有劲,教程出来之后一般两天之内就能翻译并发表。もう一つの理由は、外国人flexer who書いたの優れたチュートリアルもずっと少なくてすむ、 kuwamotoに長い時間が書かれた、マットchotinに長い時間が書かれた、ピーターent定期的に更新しないとは異なり、編集して項目を、 1つ入力し、それは、ああ、私の翻訳にまたyoujin 、チュートリアルアウトした後、 2日間に翻訳されると一般公開します。
一开始想要翻译东西是觉得博客内容太空,自己写原创的没什么水平,翻译东西又省劲又可以增加博客的含金量,后来证实这样做确实招来了一些忠实读者,而且好像开始整个Flex界就我自己在翻译东西,我的博客一下子就成了独一无二的,极大满足了我的虚荣心,也是我持续翻译的动力。私のブログのコンテンツを翻訳することスペース、書き込みして、オリジナルのレベルの翻訳とfreshenedものに金を増加させるには、 Blogのコンテンツ、機能は、認定を行うには熱心な読者数を持参するが、全体のように起動してフレックスセクター自分自身の上での翻訳のことを、突然のすべてのブログになったユニークな、素晴らしい私の虚栄心を満たす、私も継続的に翻訳する勢いです。 现在感觉翻译东西越来越像体力活了,刚开始的时候还可以提高点英语水平,后来就没什么可提高的了,想要提高英文水平的还是别走翻译这条路。翻訳は今すぐ何かのような感じtili獲増えて、最初の時間の英語の標準を上げることもできます。時点で、しかし、何もを向上させるために、選択を高めるための英語への翻訳や、標準のbiezouこの道路です。 其实国内也只有我这样的学生才会去翻译东西,翻译东西放在网上完全是无私奉献,而且对提高自己的技术水平作用不大,大家都在努力编码期待可以变成牛人挣大钱买房买车,翻译这种没有好处的事情鲜有人干。実際には、私は国内の学生のみを翻訳することは、オンライン翻訳することは完全に無私無欲の献身、その技術水準を向上させるだけでなく、ほとんどは、私たちは皆、作業コードを心待ちになって牛の人々が購入に多額の資金車を買う、このような翻訳はないささいなことでいくつかの人々に恩恵をもたらす。 翻译这些文章带给我的最大好处是:我自己一步一步建立了一个资料库,关于Flex的中文资料我根本不用去其他站点找。これらの記事を翻訳、私もたらすの最大の利点は:私はステップバイステップの設立のためのデータベースの情報を中国語のFlex私だけではありません。他のサイトを探しています。 还有就是,这些可能在找工作的时候有用,它们至少证明了我在大学的时候主动做了一些有意义的事情。には、これらの5月に役立つ仕事を探すとき、彼らが立証された少なくとも私率先してやるで大学に入学したときにこれを行うにいくつかの有意義なものです。
英文原文:Taking Adobe AIR Applications Offline英語のテキスト:撮影はAdobe 空気アプリケーションのオフライン
原文地址: http://labs.adobe.com/wiki/index.php/AIR:Articles:Taking_Apollo_Applications_Offline元の住所: http://labs.adobe.com/wiki/index.php/air:articles:taking_apollo_applications_offline
原文作者:John C. Bland II ( http://blogs.katapultmedia.com/jb2 )オリジナルの著者:ジョンC.当たり障りのない2世( http://blogs.katapultmedia.com/jb2 )
译者:Dreamer 此文未经同意,谢绝转载。翻訳:ドリーマーこの記事の同意なく、再版を拒否しています。
让Adobe AIR 程序离线运行 空気の手続きをオフラインでの操作はAdobe
在我看来,AIR最好的功能之一就是可以创建可以在线运行也可以离线运行的应用程序。私の考えで、空気が最高の特徴の1つ作成することができますオンラインオフラインで実行中のアプリケーションを実行することもできます。 应用程序允许用户在离线状态下对他们的帐户,目录等进行修改,然后当恢复连接时将数据在线同步。アプリケーションにより、ユーザーがオフラインの状態をそのアカウントのようなディレクトリに変更することが、と入力し、再開への接続を同期させるときにデータをオンラインにします。 有了这个功能,用户肯定更喜欢这个程序。この機能により、ユーザーが確かにこのプロセスを好む。
这篇文章中,我将会讲述如何在离线和在线状态下管理你的程序。この記事は、私がたてば分かるオフラインおよびオンラインで管理する方法について説明します。 我将把重点放在如何管理网络状态以及处理基本数据,而不是如何开发AIR程序和Flex 2.0.1程序。私は、ネットワークを管理する方法に焦点を当てるの状態と基本的なデータに対処するのではなく、手続きとFlexを開発する方法を2.0.1空気の手続きです。 我将尽量使用简单的数据(XML)来演示在线获取数据和离线管理数据。私は単純なデータを十分に活用( XMLの)をデモをオンラインとオフラインのデータ管理データのアクセスをします。
请记住所有的代码都是应用于AIR Alpha 1,而且这些代码是以我自己的方式写的,尽管我觉得这种方式很好,但是它并不是标准。ということをご留意のコードを適用するとすべての空気アルファ1 、しかし、自分自身のコードを書く方法は、このように非常に良いと思うものの、それ標準ではない。 你可以阅读完代码之后按照自己的方式去实现。終了した後のコードを読むことができますを達成するために、独自の方法です。
要求: 要件:
• Flex Builder 2.0.1 • Flex Builderの2.0.1
• Flash Player 9 • Flash Playerを9
• AIR runtime • 空気のランタイム
示例源码: 例ソース:
john_bland_sample_code.zip (1.83 MB) john_bland_sample_code.zip ( 1.83メガバイト)
检测网络状态 ネットワークの状態の検出
我将跳过Flex Builder来直接讨论代码。私はスキップさに直接のFlex Builderを議論するコードです。 更多关于设定Flex Builder以及创建Flex程序的信息,请参考Flex开发者中心的关于IDE的章节 。を設定する詳細については、 FlexとFlex Builderの詳細については、 Flexデベロッパーセンターを参照してください上のIDE章です。
AIR的Alpha 1版本提供了一个有用的事件(Event.NETWORK_CHANGE),当网络状态发生改变的时候它就会通知程序。空気は、アルファ1バージョンでは、有用なイベント( event.network_change ) 、ときに、ネットワークの状態を通知する時間を変更することは手続きをします。 这个事件并不会告诉你程序是否在线,它只是告诉你网络状态改变了:你可能处于离线状态、或在线状态、或登录到了一个VPN系统等。この事件は、特定のプロセスに伝える弊社のオンラインかどうか、それだけでネットワークの状態を変更するにする:オフラインまたはオンラインされることがありますか、またはVPNのシステムにアクセスして下さい。
让我们以捕获NETWORK_CHANGE 事件的基本代码开始。ご連絡をキャプチャするnetwork_change事件の基本的なコードが始まった。
[Code (AIROffline_Step1.mxml)] [コード( airoffline_step1.mxml ) ]
<?xml version=”1.0″ encoding=”utf-8″?> <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? >
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute” creationComplete=”init()”> <mx:windowedapplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationcomplete="init()">
<mx:Script> <mx:script>
<![CDATA[ < ! [のCDATA [
private function init():void{プライベート機能のinit ( ) :無効(
Shell.shell.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); shell.shell.addeventlistener ( event.network_change 、 onnetworkchange ) ;
} )
private function onNetworkChange(event:Event):void{プライベート関数onnetworkchange (イベント:イベント) :無効(
trace(event);トレース(イベント) ;
} )
]]> ] " >
</mx:Script> < / MXの:スクリプト>
</mx:WindowedApplication> < / MXの: windowedapplication >
[/Code] [ /コード]
这段代码是检测网络的最短的代码。このコードは、最短のネットワークコードを検出します。 一旦程序的creationComplete 事件触发了init() 方法,init() 方法就会为Shell添加一个事件监听器并将触发器函数设定为onNetworkChange。一度の手続きcreationcomplete事件の引き金init ( )メソッドは、 init ( )メソッドを追加するにはシェルイベントリスナーとトリガ機能はonnetworkchangeに設定されています。 在trace()语句那一行设置一个断点并以调试方式启动。は、トレース( )ステートメントの行にブレークポイントを設定するには、デバッグを開始する方法です。 当程序运行了以后断开网络连接,你会发现Flex Builder中程序运行到了断点处(看图1)。プログラムを実行するときに、ネットワーク接続をした後では、 Flex Builderのプログラムを実行して、ブレークポイント(プラグ)です。

图1.程序断点 図1 。ブレークポイントの手続き
确定在线状态 特定のオンライン
现在程序已经可以检测到网络状态的更改了。今すぐ手続きが検出されたことができるネットワークの状態を変更してください。 现在你需要知道当前的状态(在线或离线),我们将尝试加载数据,如果可以的话我们就处于在线状态,如果不能地话我们就假定已经离线了。今すぐあなたの現在の状態を知る必要が(オンラインまたはオフライン)が、我々は試してデータを読み込むので、私たちは、オンラインの場合、と仮定していない場合はをすれば、オフラインです。 现在让我们添加一点代码来检测网络状态。今すぐご連絡ネットワークの状態を検出するコードを追加しています。 注意,未来了某个AIR版本有可能使我们不必写这些代码。に注意して、次のバージョンの可能性、特定の空気ですから、私たちのコードを書いていない。
[Code (AIROffline_Step2.mxml)] [コード( airoffline_step2.mxml ) ]
<?xml version=”1.0″ encoding=”utf-8″?> <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? >
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml” < MXの: windowedapplication xmlns : MXの= " http://www.adobe.com/2006/mxml "
layout=”absolute” creationComplete=”init()”>レイアウト= "絶対的な" creationcomplete = "のinit ( ) " >
<mx:Script> <mx:script>
<![CDATA[ < ! [のCDATA [
[Bindable] [連結]
private var isOnline:Boolean = false;民間var isonline :ブール値=偽;
private var request:URLRequest = new URLRequest(”http://blogs.katapultmedia.com/jb2/_dev/onlineoffline/data/rooms.xml”);民間varリクエスト: urlrequest =新しいurlrequest ( " http://blogs.katapultmedia.com/jb2/_dev/onlineoffline/data/rooms.xml " ) ;
private var requestLoader:URLLoader = new URLLoader();民間var requestloader : urlloader =新しいurlloader ( ) ;
private function init():void{プライベート機能のinit ( ) :無効(
requestLoader.addEventListener(Event.COMPLETE, requestCompleteHandler); requestloader.addeventlistener ( event.complete 、 requestcompletehandler ) ;
requestLoader.addEventListener(IOErrorEvent.IO_ERROR, requestErrorHandler); requestloader.addeventlistener ( ioerrorevent.io_error 、 requesterrorhandler ) ;
Shell.shell.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); shell.shell.addeventlistener ( event.network_change 、 onnetworkchange ) ;
requestLoader.load(request); requestloader.load (リクエスト) ;
} )
private function onNetworkChange(event:Event):void{プライベート関数onnetworkchange (イベント:イベント) :無効(
isOnline = !isOnline isonline = ! isonline
trace(”Connected to Internet? ” isOnline);トレース( "インターネットに接続してですか? " isonline ) ;
} )
private function requestErrorHandler(event:IOErrorEvent):void{プライベート関数requesterrorhandler (イベント: ioerrorevent ) :無効(
isOnline = false; isonline =偽;
} )
private function requestCompleteHandler(event:Event):void{プライベート関数requestcompletehandler (イベント:イベント) :無効(
isOnline = true; isonline =真;
} )
]]> ] " >
</mx:Script> < / MXの:スクリプト>
</mx:WindowedApplication> < / MXの: windowedapplication >
[/Code] [ /コード]
我们在代码中添加了一些东西。私たちは何かのコードを追加します。 首先让我们简要地看一下流程。まず第一に、ご連絡のプロセスを簡単に見ています。
1.程序初始化 1 。初期化プロシージャ
2.象对网络连接发生改变时所作的一样,为数据的加载成功和加载失败添加一个事件监听器。 2 。として作られるのネットワークを変更すると、同じデータを読み込んでいます読み込んでいますの成功に向けてのイベントリスナーの追加に失敗しました。
3.尝试加载XML文件(或者加载你需要的任何文件/数据) 3 。試みは、 XMLファイルをロードする(または任意のドキュメントをロードする必要があります/データ)
现在程序可以确定连接状态了,我们的监听器函数将会相应地对isOnline变量做更改。今すぐ手続きの接続状態を確認するには、モニタの機能はこれを行うには、対応する権利isonline変数の変更を適用します。 注意onNetworkChange()方法很少将isOnline的值置反,处理这个的一种较好的方法就是同时访问一下服务器来确定连接状态。注: onnetworkchange ( )メソッドの値をisonlineめったにホームでこれに対処するには良い方法は、同じ時間にアクセスしてサーバーに接続状態を確認するにします。
现在NETWORK_CHANGE事件关联了很多东西,正如上面所说,当你从在线状态变成离线状态的时候会触发该事件,但是当你连接到VPN或其它状态改变的时候也会触发该事件。今すぐnetwork_changeイベント相関する多くのものを、上述したように、オフラインからオンラインになったときに時間が事件を誘発する、しかしに接続するときには、 VPN 、またはその他の変更のステータスはこの事件を引き起こす。 记住,服务器两次检查在线状态的时候可能会离线,这会使数据加载数据失败,导致程序显示为离线状态。覚えて、サーバーのチェックの2倍の時間5月にオンラインオフラインで、このデータの読み込みに失敗するデータを、その結果として表示される手順をオフラインにします。 希望下一个版本中的网络更新会改进这一过程。期待して、次のバージョンのプロセスを改善するために、更新、ネットワークに接続しています。
现在NETWORK_CHANGE事件关联了很多东西,正如上面所说,当你从在线状态变成离线状态的时候会触发该事件,但是当你连接到VPN或其它状态改变的时候也会触发该事件。今すぐnetwork_changeイベント相関する多くのものを、上述したように、オフラインからオンラインになったときに時間が事件を誘発する、しかしに接続するときには、 VPN 、またはその他の変更のステータスはこの事件を引き起こす。 记住,服务器两次检查在线状态的时候可能会离线,这会使数据加载数据失败,导致程序显示为离线状态。覚えて、サーバーのチェックの2倍の時間5月にオンラインオフラインで、このデータの読み込みに失敗するデータを、その結果として表示される手順をオフラインにします。 希望下一个版本中的网络更新会改进这一过程。期待して、次のバージョンのプロセスを改善するために、更新、ネットワークに接続しています。
以调试模式运行上面的代码,然后在连接状态和无连接状态观察控制台(Console)视图。上記のコードのデバッグモードで実行され、と入力し、接続状態で、非接続の状態を観察するコンソール(コンソール)表示します。

图2. 连接状态和无连接状态下的控制台视图 図2 。接続のコンソールとの接続の状態を表示
创建一个基于状态的程序 以下の手順に基づいて状態を作成する
现在我们已经知道了连接状态而且仅仅需要我们的程序相应地作出响应。今すぐ私たちは既に知っている接続の状態とそのプロセスに対応するため私たちだけが必要です。 现在你要做的是将currentState属性绑定到isOnline变量来获得所需的效果或流程。これを行うには、今すぐする必要があります。 isonline currentstateにバインドする変数を取得するために必要な属性効果やプロセスです。
改变程序的状态 手続きのステータスを変更して
在这里我假定你很熟悉Flex 2中的绑定,所以对这些基础就一带而过了。ここでは、私を前提としては非常に精通しているのFlex 2は、結合、これに基づいて同地区を拠点と、これらの前にします。 这里我们要做的是根据isOnline的值切换状态。ここで私たちがこれを行うには、スイッチングの値に基づいてisonline状態です。
[Code (snippet; AIROffline_Step3.mxml)] [コード(スニペット; airoffline_step3.mxml ) ]
<?xml version=”1.0″ encoding=”utf-8″?> <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? >
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml” < MXの: windowedapplication xmlns : MXの= " http://www.adobe.com/2006/mxml "
layout=”absolute” creationComplete=”init()”レイアウト= "絶対的な" creationcomplete = " init ( )を"
currentState=”{isOnline ? ‘Online’ : ‘Offline’}”> currentstate = " ( isonlineですか? 'オンライン' : 'オフライン' ) " >
[/Code] [ /コード]
你需要注意的是currentState 那一行。あなたに注意を払う必要があるのcurrentstateの行です。 它告诉我们在线或离线状态的改变是基于isOnline变量的。それを教えてくれるオンラインまたはオフラインでの変更はisonline変数に基づいています。 很简单,是不是?非常に単純なものではない» 现在让我们来创建各个状态。今すぐご連絡を作成して状態です。
[Code (snippet; AIROffline_Step3.mxml)] [コード(スニペット; airoffline_step3.mxml ) ]
<mx:states>
<mx:State name=”Online”> <mx:state name="online">
<mx:SetProperty name=”status” value=”Online”/> <mx:setproperty name="status" value="online"/>
</mx:State> < / MXの:都道府県>
<mx:State name=”Offline”> <mx:state name="offline">
<mx:SetProperty name=”status” value=”Offline”/> <mx:setproperty name="status" value="offline"/>
</mx:State> < / MXの:都道府県>
</mx:states> < / MXの:国>
[/Code] [ /コード]
在每个状态中,我们仅仅改变了WindowedApplication.status 的值来显示当前的状态。それぞれの状態に、私たちだけ変更して値を表示するにwindowedapplication.statusの現在の状態です。 对于习惯图形化界面表示的你来说,可能想让我根据状态用灰色或全彩色来表示网络连接,好吧,我将添加一个状态条来满足你的图形化要求。グラフィカルなインターフェイスをするのが癖にそれはあなた、私を使用するかもしれないの状態をフルカラーの下に灰色またはネットワークに接続して、いいわ、私は追加のいずれかの状態にしてグラフィックの要求を満たしている。
接下来让我们处理数据。次へご連絡に対処することができます。
管理数据 データ管理
我们已经可以知道当前的状态是什么了,现在需要做的就是处理数据。私たちは既にの現在の状態を参照しては何ですし、今すぐこの操作を行うには、データ処理が必要です。 首先让我们看一下需要做的事情以及想要的结果。まず第一に、見てみよう完了する必要がありますし、その結果を選択します。
•如果是离线状态,加载本地数据文件。 •オフラインにする場合は、ローカルデータファイルを読み込んでいます。
•如果是在线状态,加载线上的数据文件并将其保存在本地,为将来离线加载做准备。 •オンラインの場合には、オンラインのデータファイルを読み込んでいますローカルに保存され、オフラインでの将来に備えて読み込んでいます。 (如果加载数据失败,就回过头来加载本地数据文件) (場合は、データの読み込みに失敗しましたの背面に、ローカルのデータファイルをロードする)
•如果网络状态从离线变成在线,就加载线上数据并重复上一步。 •ネットワークの状態からの場合、オンライン、オフラインを、オンライン上のデータにロードさのステップを繰り返します。
•结果:程序自动更新数据(通过绑定),而且不管状态如何数据一直是可用的。 •結果:このプログラムのデータを自動的に更新プログラム(を通じてボンディング) 、しかし、どんなに状態のデータは入手可能です。
大部分的代码都和上面的差不多,这里我只给出一些代码片断以便你更清楚地看到是哪里做了更改。ほとんどのコードとほぼ上記の、ここに私はいくつかのコードの断片を与えることのみをより明確にするためには、変更を参照している。
[Code (snippet; Script block; AIROffline_Step4.mxml)] [コード(スニペット;スクリプトブロック; airoffline_step4.mxml ) ]
import flash.filesystem.*;インポートflash.filesystem .* ;
private var localFile:File = File.appStorageDirectory.resolve(”AIROffline/rooms.xml”);民間var localfile :ファイル= file.appstoragedirectory.resolve ( " airoffline / rooms.xml " ) ;
private var localFileStream:FileStream;民間var localfilestream : filestream ;
…[other code] … [その他のコード]
private function init():void{プライベート機能のinit ( ) :無効(
requestLoader.addEventListener(Event.COMPLETE, requestCompleteHandler); requestloader.addeventlistener ( event.complete 、 requestcompletehandler ) ;
requestLoader.addEventListener(IOErrorEvent.IO_ERROR, requestErrorHandler); requestloader.addeventlistener ( ioerrorevent.io_error 、 requesterrorhandler ) ;
Shell.shell.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); shell.shell.addeventlistener ( event.network_change 、 onnetworkchange ) ;
//create/open local file / /作成/ローカルファイルを開きます
localFileStream = new FileStream(); localfilestream =新しいfilestream ( ) ;
localFileStream.open(localFile, FileMode.Update); localfilestream.open ( localfile 、 filemode.update ) ;
localFileStream.close(); localfilestream.close ( ) ;
loadData(); loaddata ( ) ;
} )
[/Code] [ /コード]
对于文件管理来说, AIR for Adobe Flex Developers Pocket Guide是一本很好的参考书,所以这里我不会介绍太多的细节。は、ドキュメント管理、 空気のAdobe Flexの開発者のポケットガイド参考図書は非常に良いので、ここに私があまりにも多くの詳細を紹介します。 我们在变量声明部分所做的就是创建了一个FileStream对象并将其赋给了localFile。私たちは声明で作られるいくつかの変数を作成するには、 FileStreamオブジェクトを割り当てるにはlocalfileです。 如果文件存在,FileMode.Update将会它,如果文件不存在,就创建一个空白文件。もしその文書が存在する場合は、 filemode.updateそれは、場合は、ファイルが存在しない場合は、空白のドキュメントを作成する。 然后文件就会被关闭,因为在这里我们想要做的就是要确保这个XML文件存在。が閉鎖さ入力し、ドキュメントのため、ここで私たちがやりたいのは、 XMLファイルを確保するために存在しています。
[Code (snippet; AIROffline_Step4.mxml)] [コード(スニペット; airoffline_step4.mxml ) ]
//Cleanup Methods / /クリーンアップの方法
private function applicationClosingHandler(event:*):void{プライベート関数applicationclosinghandler (イベント: * ) :無効(
localFileStream.close(); localfilestream.close ( ) ;
} )
//Data Methods / /データの方法
private function loadData():void{プライベート関数loaddata ( ) :無効(
requestLoader.load(request); requestloader.load (リクエスト) ;
} )
private function readLocalFile():void{プライベート関数readlocalfile ( ) :無効(
localFileStream.open(localFile, FileMode.READ); localfilestream.open ( localfile 、 filemode.read ) ;
roomsXML = XML(localFileStream.readUTFBytes(localFileStream.bytesAvailable)); roomsxml =のXML ( localfilestream.readutfbytes ( localfilestream.bytesavailable ) ) ;
localFileStream.close(); localfilestream.close ( ) ;
} )
private function saveDataLocally():void{プライベート関数savedatalocally ( ) :無効(
localFileStream.open(localFile, FileMode.WRITE); localfilestream.open ( localfile 、 filemode.write ) ;
localFileStream.writeUTFBytes(’<?xml version=”1.0″ encoding=”utf-8″?>\n’ roomsXML.toXMLString()); localfilestream.writeutfbytes ( " <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? > \ n ' roomsxml.toxmlstring ( ) ) ;
localFileStream.close(); localfilestream.close ( ) ;
} )
//Connection methods / /接続方法
private function onNetworkChange(event:Event):void{プライベート関数onnetworkchange (イベント:イベント) :無効(
isOnline = !isOnline isonline = ! isonline
if(isOnline){もし( isonline ) (
loadData(); loaddata ( ) ;
} )
} )
private function requestErrorHandler(event:IOErrorEvent):void{プライベート関数requesterrorhandler (イベント: ioerrorevent ) :無効(
isOnline = false; isonline =偽;
//Get data from local file / /ローカルファイルからデータを取得する
readLocalFile(); readlocalfile ( ) ;
} )
private function requestCompleteHandler(event:Event):void{プライベート関数requestcompletehandler (イベント:イベント) :無効(
isOnline = true; isonline =真;
roomsXML = XML(requestLoader.data); roomsxml =のXML ( requestloader.data ) ;
//Write data locally / /書き込みデータの局所
saveDataLocally(); savedatalocally ( ) ;
} )
[/Code] [ /コード]
applicationClosingHandler()函数只是为了确保在程序关闭的时候FileStream也会随之关闭。 applicationclosinghandler ( )関数は、プロセスの終了を確保するためfilestreamしてもシャットダウンします。 上面的大部分代码想必你已经很熟悉了,这里注意readLocalFile() 和saveDataLocally() 两个函数,这两个函数是用来管理本地文件或数据的,它们的工作流程如下:おそらく、上記のコードの大部分を既に非常に精通して、ここでの注目をreadlocalfile ( )とsavedatalocally ( )の2つの関数は、これらの2つの関数を使用してローカルファイルやデータの管理、およびそれらの作業プロセスは以下のとおり:
如果isOnline == trueもし== trueをisonline
# 在初始数据加载之后调用requestCompleteHandler() #を呼び出した後、最初のデータが読み込まれるrequestcompletehandler ( )
# 数据被保存在roomsXML变量中,由于进行了绑定程序的显示会自动更新。 #データを変数に格納されroomsxml 、結合の結果として、ディスプレイが自動的に更新手続きをします。
# 调用saveDataLocally() #呼び出しsavedatalocally ( )
# 将roomsXML中的数据保存到FileStream # roomsxmlデータを保存するには、 filestream
如果isOffline == false ==偽の場合isoffline
# 调用requestErrorHandler() #呼び出しrequesterrorhandler ( )
# 调用readLocalFile() #呼び出しreadlocalfile ( )
# 将本地roomsXML文件中的内容保存在roomsXML中 #ローカルroomsxmlの内容を文書に格納されてroomsxml
处于在线状态的时候我们只需要刷新本地数据,这样的话只有在isOnline为true的时候onNetworkChange()才需要再次调用loadData()。オンライン時に新鮮なローカルデータのみを必要とするので、 isonlineだけでいるときにtrue onnetworkchange ( )を呼び出す必要がのみloaddata ( ) 。 一旦加载了数据就重复上面“如果isOnline == true”的步骤,将数据保存到本地并重新设置roomsXML的值,然后更新界面显示。一度のデータを読み込んでいますを繰り返し、 "もしisonline == true "をローカルデータに保存して手順を実行し、再設定roomsxml値を入力し、更新して表示するインターフェイスです。
我在显示中多添加了几个数据项,这样就可以看到数据的改变。私によると、いくつかのアイテムを超えるのデータを追加するには、このようなデータを参照して変更します。
[Code] [コード]
<mx:VBox width=”100%” height=”100%”> <mx:vbox width="100%" height="100%">
<mx:Text text=”{roomsXML.Room.length()} Rooms Available”/> <mx:text text="{roomsxml.room.length()}部屋available"/>
<mx:TextArea id=”RoomsList” width=”100%” height=”100%” text=”{roomsXML.toXMLString()}” selectable=”false” editable=”false”/> <mx:textarea id="roomslist" width="100%" height="100%" text="{roomsxml.toxmlstring()}" selectable="false" editable="false"/>
</mx:VBox> < / MXの:車速計VBOX >
[/Code] [ /コード]
这个时候,下面所示的XML数据是线上的。この時期に示すように、 XMLデータがオンラインには、次のです。 图3显示了实用这个XML数据程序运行后的结果。図3に示して実用的な操作は、次のXMLデータの手続きをした後、結果です。
[Code (data/rooms.xml)] [コード(データ/ rooms.xml ) ]
<?xml version=”1.0″ encoding=”utf-8″?> <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? >
<Rooms> <rooms>
<Room name=”Room 1″ /> <room name="room 1" />
<Room name=”Room 2″ /> <room name="room 2" />
<Room name=”Room 3″ /> <room name="room 3" />
<Room name=”Room 4″ /> <room name="room 4" />
<Room name=”Room 5″ /> <room name="room 5" />
<Room name=”Room 6″ /> <room name="room 6" />
<Room name=”Room 7″ /> <room name="room 7" />
<Room name=”Room 8″ /> <room name="room 8" />
<Room name=”Room 9″ /> <room name="room 9" />
<Room name=”Room 10″ /> <room name="room 10" />
</Rooms> < /部屋>
[/Code] [ /コード]

图3. 使用这个XML数据运行程序 図3 。の使用を、 XMLデータの運用手順
现在,我将断开网络连接,关闭程序然后重新运行它。今すぐ、私はネットワーク接続を切断して、閉会の手続きを再度実行してください。 (看图4) (プラグ4 )

图4.重新运行程序 図4 。再プログラムを実行する
OK,没有什么两样对吧?よし、何ら変わりは右» 唯一发生改变的是底部所示的网络状态,现在我将关闭程序,然后在更新线上XML数据以后断开网络连接。唯一の変更は、ネットワークの下に表示され、そして今、私は手続きを無効にする、と入力し、オンラインでXMLデータを更新してネットワーク接続を切断した後です。
下面是新的XML(只是复制了一下Room节点)。以下は、新しいXML (ルームのみのコピーを、ノードの)です。
[Code (data/rooms.xml)] [コード(データ/ rooms.xml ) ]
<?xml version=”1.0″ encoding=”utf-8″?> <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? >
<Rooms> <rooms>
<Room name=”Room 1″/> <room name="room 1"/>
<Room name=”Room 2″/> <room name="room 2"/>
<Room name=”Room 3″/> <room name="room 3"/>
<Room name=”Room 4″/> <room name="room 4"/>
<Room name=”Room 5″/> <room name="room 5"/>
<Room name=”Room 6″/> <room name="room 6"/>
<Room name=”Room 7″/> <room name="room 7"/>
<Room name=”Room 8″/> <room name="room 8"/>
<Room name=”Room 9″/> <room name="room 9"/>
<Room name=”Room 10″/> <room name="room 10"/>
<Room name=”Room 1″/> <room name="room 1"/>
<Room name=”Room 2″/> <room name="room 2"/>
<Room name=”Room 3″/> <room name="room 3"/>
<Room name=”Room 4″/> <room name="room 4"/>
<Room name=”Room 5″/> <room name="room 5"/>
<Room name=”Room 6″/> <room name="room 6"/>
<Room name=”Room 7″/> <room name="room 7"/>
<Room name=”Room 8″/> <room name="room 8"/>
<Room name=”Room 9″/> <room name="room 9"/>
<Room name=”Room 10″/> <room name="room 10"/>
<Room name=”Room 1″/> <room name="room 1"/>
<Room name=”Room 2″/> <room name="room 2"/>
<Room name=”Room 3″/> <room name="room 3"/>
<Room name=”Room 4″/> <room name="room 4"/>
<Room name=”Room 5″/> <room name="room 5"/>
<Room name=”Room 6″/> <room name="room 6"/>
<Room name=”Room 7″/> <room name="room 7"/>
<Room name=”Room 8″/> <room name="room 8"/>
<Room name=”Room 9″/> <room name="room 9"/>
<Room name=”Room 10″/> <room name="room 10"/>
</Rooms> < /部屋>
[/Code] [ /コード]
现在,我将在离线状态下重新运行程序,加载完本地数据的结果和图4中所示一样。今すぐ、私はオフラインでの手続きを再実行し、ローカルデータを読み込んでいます終了し、その結果図4に示すようにします。 接下来你将看到一些有趣的事情。次のページが表示さいくつかの興味深いものです。 我将保持程序的运行,然后连接网络。私は運用手順を維持する、と入力し、ネットワークに接続しています。 线上的数据会被下载下来并保存在本地(看图5)。は、オンラインのデータがダウンロードされ、保存するには、ローカル(のプラグ5 ) 。

图5. 线上数据被下载并保存在本地 図5 。オンラインデータをダウンロードし、ローカルに保存され
好极了!すばらしい! 注意程序并没有被关闭,它一直在运行,我只是连接了网络而已。手続きの注意を閉鎖されていない、それが操作され、私だけのネットワークに接続しているのみです。
最后,我将断开网络然后重新运行程序。最後に、私はネットワークの接続を解除すると入力し、再実行しているプログラムです。 运行结果和图5中所示一样,只是状态变成了离线。し、その結果を図5に示すように、オフラインのみの状態にします。
最终代码: の最後のコード:
[Code] [コード]
<?xml version=”1.0″ encoding=”utf-8″?> <ですか? XMLのバージョン= " 1.0 "エンコーディング=は" utf - 8 "ですか? >
<mx:WindowedApplication xmlns:mx=”http://www.adobe.com/2006/mxml” < MXの: windowedapplication xmlns : MXの= " http://www.adobe.com/2006/mxml "
layout=”absolute” creationComplete=”init()”レイアウト= "絶対的な" creationcomplete = " init ( )を"
currentState=”{isOnline ? ‘Online’ : ‘Offline’}” currentstate = " ( isonlineですか? 'オンライン' : 'オフライン' ) "
closing=”applicationClosingHandler(event)”>閉会= " applicationclosinghandler (イベント) " >
<mx:Script> <mx:script>
<![CDATA[ < ! [のCDATA [
import flash.filesystem.*;インポートflash.filesystem .* ;
private var localFile:File = File.appStorageDirectory.resolve("AIROffline/rooms.xml");民間var localfile :ファイル= file.appstoragedirectory.resolve ( " airoffline / rooms.xml " ) ;
private var localFileStream:FileStream;民間var localfilestream : filestream ;
[Bindable] [連結]
private var isOnline:Boolean = false;民間var isonline :ブール値=偽;
private var request:URLRequest = new URLRequest(”http://blogs.katapultmedia.com/jb2/_dev/onlineoffline/data/rooms.xml”);民間varリクエスト: urlrequest =新しいurlrequest ( " http://blogs.katapultmedia.com/jb2/_dev/onlineoffline/data/rooms.xml " ) ;
private var requestLoader:URLLoader = new URLLoader();民間var requestloader : urlloader =新しいurlloader ( ) ;
[Bindable] [連結]
private var roomsXML:XML = new XML();民間var roomsxml : XMLの=新しいXML ( ) ;
private function init():void{プライベート機能のinit ( ) :無効(
requestLoader.addEventListener(Event.COMPLETE, requestCompleteHandler); requestloader.addeventlistener ( event.complete 、 requestcompletehandler ) ;
requestLoader.addEventListener(IOErrorEvent.IO_ERROR, requestErrorHandler); requestloader.addeventlistener ( ioerrorevent.io_error 、 requesterrorhandler ) ;
Shell.shell.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); shell.shell.addeventlistener ( event.network_change 、 onnetworkchange ) ;
//create/open local file / /作成/ローカルファイルを開きます
localFileStream = new FileStream(); localfilestream =新しいfilestream ( ) ;
localFileStream.open(localFile, FileMode.Update); localfilestream.open ( localfile 、 filemode.update ) ;
localFileStream.close(); localfilestream.close ( ) ;
loadData(); loaddata ( ) ;
} )
//Cleanup Methods / /クリーンアップの方法
private function applicationClosingHandler(event:*):void{プライベート関数applicationclosinghandler (イベント: * ) :無効(
localFileStream.close(); localfilestream.close ( ) ;
} )
//Data Methods / /データの方法
private function loadData():void{プライベート関数loaddata ( ) :無効(


