5

フラッシュファイルでこのコードを使用しています

import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;

var monitor:URLMonitor;

function checkInternetConnection(e:Event = null):void
{
var url:URLRequest = new URLRequest("http://www.google.com");
url.method = "HEAD";
monitor = new URLMonitor(url);
monitor.pollInterval = 1000;
//
monitor.addEventListener(StatusEvent.STATUS, checkHTTP);
//
function checkHTTP(e:Event = null):void
{
if (monitor.available) {

       navigateToURL(new URLRequest("flickr.html"),"_top"); 

   } else {

       gotoAndPlay(1);

   }
}
monitor.start();
} 

フラッシュで接続を確認し、再生されない場合は別のページに移動しようとしています。

機能していないようです。私は何か不足していますか?

ライブラリ パスを aircore.swc にも追加しました。

AIR アプリではなく、Flash を使用した HTML ページを意図しています。

乾杯

4

3 に答える 3

7

(私の評判は低すぎて、Tianzhen Linの回答に直接コメントできません...)

Tianzhen Lin の回答が期待どおりに機能するようにするには、いくつかの変更を加える必要がありました。

  • 追加した:

    urlRequest.useCache = false;
    urlRequest.cacheResponse = false;
    

    この追加が必要だったのは、接続が確実に失われた場合でも、キャッシュが読み取られているためにチェックが成功していたためです。

  • かわった:

    if( textReceived.indexOf( _contentToCheck ) )
    

    に:

    if( !(textReceived.indexOf( _contentToCheck ) == -1) )
    

    この変更が必要だったのは、"" (空の文字列) が常に検出されている間、元の if() 条件が常に失敗する原因となっていたインデックス '0' で検出されたためです。

  • 追加した:

    urlRequest.idleTimeout = 10*1000;
    

    ネットワーク ケーブルがルーターから物理的に切断されている場合、リクエストがタイムアウトするまでに非常に長い時間がかかることがあります (正直なところ、私は数分後に待つのにうんざりしました.)

上記の変更を行った後、Tianzhen のコードが完全に機能することがわかりました。Wi-Fi の切断/再接続 (iOS デバイスと Android デバイスの両方) に関係なく、接続状態の変化は常に検出されました。

于 2013-09-25T22:57:41.430 に答える
6

あなたのコードには 2 つの問題があります。1 つは、インターネット接続をチェックするロジックはあるものの、関数を呼び出すコードがないため、リダイレクトのロジックが呼び出されないことです。2 つ目は、AIRcore.swc を使用することは、ブラウザのサンドボックスで動作しないか違反する可能性のある依存関係を注入したため、悪い考えです。

テスト済みで AIR の SWC を必要としない次のアプローチを試すことができます。

ステップ 1、次のように新しいクラスConnectionCheckerを含めます。

package
{
    import flash.events.*;
    import flash.net.*;

    [Event(name="error", type="flash.events.Event")]
    [Event(name="success", type="flash.events.Event")]
    public class ConnectionChecker extends EventDispatcher
    {
        public static const EVENT_SUCCESS:String = "success";
        public static const EVENT_ERROR:String = "error";

        // Though google.com might be an idea, it is generally a better practice
        // to use a url with known content, such as http://foo.com/bar/mytext.txt
        // By doing so, known content can also be verified.

        // This would make the checking more reliable as the wireless hotspot sign-in
        // page would negatively intefere the result.
        private var _urlToCheck:String = "http://www.google.com";


        // empty string so it would always be postive
        private var _contentToCheck:String = "";    

        public function ConnectionChecker()
        {
            super();
        }

        public function check():void
        {
            var urlRequest:URLRequest = new URLRequest(_urlToCheck);
            var loader:URLLoader = new URLLoader();
            loader.dataFormat = URLLoaderDataFormat.TEXT;

            loader.addEventListener(Event.COMPLETE, loader_complete);
            loader.addEventListener(IOErrorEvent.IO_ERROR, loader_error);

            try
            {
                loader.load(urlRequest);
            }
            catch ( e:Error )
            {
                dispatchErrorEvent();
            }
        }

        private function loader_complete(event:Event):void
        {
            var loader:URLLoader = URLLoader( event.target );
            var textReceived:String = loader.data as String;

            if ( textReceived )
            {
                if ( textReceived.indexOf( _contentToCheck ) )
                {
                    dispatchSuccessEvent();
                }
                else
                {
                    dispatchErrorEvent();
                }
            }
            else
            {
                dispatchErrorEvent();
            }
        }

        private function loader_error(event:IOErrorEvent):void
        {
            dispatchErrorEvent();
        }


        private function dispatchSuccessEvent():void
        {
            dispatchEvent( new Event( EVENT_SUCCESS ) );
        }

        private function dispatchErrorEvent():void
        {
            dispatchEvent( new Event( EVENT_ERROR ) );
        }
    }
}

ステップ 2、メイン アプリケーションまたはインターネット接続を確認する必要がある場所で、次のスニペットを使用します。

var checker:ConnectionChecker = new ConnectionChecker();
checker.addEventListener(ConnectionChecker.EVENT_SUCCESS, checker_success);
checker.addEventListener(ConnectionChecker.EVENT_ERROR, checker_error);
checker.check();

private function checker_success(event:Event):void
{
    // There is internet connection
}

private function checker_error(event:Event):void
{
    // There is no internet connection
}
于 2012-11-26T17:15:02.880 に答える
0

air.net.URLMonitor は AIR で使用可能なクラスであるため、AIR プレーヤーの外では機能しません。

ただし、このモニター クラスが行うのは URL を "ping" して応答を確認するだけなので、独自の操作を試みることもできます。そのため、google.com などの既知のソースから何かを読み込んで、エラーなしで完了する場合は、そうしないと、エラーが発生します。

于 2012-11-26T07:37:38.980 に答える