ActionScript 3 — проверка подключения к Интернету

Я использую этот код в своем флеш-файле

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.

Это должна быть html-страница с флэш-памятью, а не приложение AIR.

Ваше здоровье


person angel13th    schedule 26.11.2012    source источник


Ответы (3)


(Моя репутация слишком низка, чтобы комментировать ответ Тяньчжэнь Линя напрямую...)

Мне нужно было внести несколько изменений, чтобы ответ Тяньчжэня Линя работал, как ожидалось:

  • Добавлен:

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

    Это дополнение было необходимо, потому что даже когда соединение определенно было потеряно, проверка все равно была успешной, потому что кэш читался из.

  • Измененный:

    if( textReceived.indexOf( _contentToCheck ) )
    

    to:

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

    Это изменение было необходимо, потому что, хотя "" (пустая строка) всегда находилась, она находилась по индексу "0", что приводило к тому, что исходное условие if() всегда терпело неудачу.

  • Добавлен:

    urlRequest.idleTimeout = 10*1000;
    

    В случае, когда сетевой кабель был физически отсоединен от роутера, запрос мог очень долго ждать тайм-аута (Честно говоря, я устал ждать уже через пару минут.)

После внесения вышеуказанных изменений я обнаружил, что код Tianzhen работает отлично: независимо от того, как я отключал/повторно подключал Wi-Fi (как на устройствах iOS, так и на Android), изменение статуса подключения всегда обнаруживалось.

person David Guy    schedule 25.09.2013
comment
почему, ваш код работает только для устройств Android, я тестировал его на обоих, я могу получить результат, только если я нахожусь на устройстве Android, для iOS он постоянно говорит, что нет подключения к Интернету, есть идеи? - person Elias Rahme; 13.10.2016

Я вижу две проблемы в вашем коде. Во-первых, хотя у вас есть логика для проверки интернет-соединения, нет любой код, вызывающий функцию, поэтому логика перенаправления не будет вызываться. Во-вторых, использование AIRcore.swc было бы плохой идеей, поскольку вы внедрили зависимость, которая может не работать с изолированной программной средой браузера или нарушать ее.

Вы можете попробовать следующий подход, который проверен и не требует SWC AIR:

Шаг 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
}
person Tianzhen Lin    schedule 26.11.2012
comment
привет, не могли бы вы проверить эту ссылку: stackoverflow.com/questions/39849033/ - person Elias Rahme; 04.10.2016
comment
Я попробовал ваш код с настройками, упомянутыми в ответе выше, он работает только на устройстве Android, нужно ли мне что-то сделать, чтобы он работал на iOS? - person Elias Rahme; 13.10.2016

air.net.URLMonitor — это доступный класс AIR, поэтому он не будет работать вне проигрывателя AIR.

Но вы можете попытаться сделать свой собственный, так как все, что делает этот класс монитора, это «пинговать» URL-адрес и проверять ответ, поэтому вы можете сделать аналогичную попытку загрузить что-то из известного источника, такого как google.com, и если он завершится без ошибки, тогда это ОК, иначе вы получите ошибку.

person Lukasz 'Severiaan' Grela    schedule 26.11.2012
comment
извините, не могли бы вы проверить эту ссылку, пожалуйста, stackoverflow.com/questions/39849033/ - person Elias Rahme; 13.10.2016