【问题标题】:Actionscript 3 - checking for an internet connectionActionscript 3 - 检查互联网连接
【发布时间】:2012-11-13 14:46:46
【问题描述】:

我在我的 Flash 文件中使用此代码

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。

它应该是一个带有 flash 的 html 页面,而不是一个 AIR 应用程序

干杯

【问题讨论】:

    标签: actionscript-3 flash-cs6


    【解决方案1】:

    (我的声望太低,无法直接评论林天真的回答……)

    为了让林天真的答案按预期工作,我需要进行一些更改:

    • 添加:

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

      之所以需要此添加,是因为即使连接肯定丢失,检查仍然成功,因为正在读取缓存。

    • 改变:

      if( textReceived.indexOf( _contentToCheck ) )
      

      到:

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

      之所以需要此更改,是因为虽然总是找到“”(一个空字符串),但它是在索引“0”处找到的,这导致原始 if() 条件总是失败。

    • 添加:

      urlRequest.idleTimeout = 10*1000;
      

      在网络电缆与路由器物理断开连接的情况下,请求可能需要很长时间才能超时(老实说,几分钟后我已经厌倦了等待。)

    进行上述修改后,我发现天真的代码运行良好:无论我如何断开/重新连接 Wi-Fi(在 iOS 和 Android 设备上),始终检测到连接状态的变化。

    【讨论】:

    • hy,你的代码只适用于安卓设备,我在两者上都测试过,如果我在安卓设备上,我只能得到结果,对于 iOS,它总是说没有互联网连接,有什么想法吗?
    【解决方案2】:

    我在您的代码中发现了两个问题。一是虽然你有check internet connection的逻辑,但没有任何代码调用该函数,因此不会调用重定向逻辑。其次,使用 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 步,在您的主应用程序或应检查互联网连接的任何地方,使用以下 sn-p:

    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
    }
    

    【讨论】:

    • 你好,你介意检查这个链接吗:stackoverflow.com/questions/39849033/…
    • 我在上面的答案中提到的调整尝试了你的代码,它只适用于安卓设备,我应该做些什么让它在 iOS 上运行?
    【解决方案3】:

    air.net.URLMonitor 是 AIR 可用类 - 因此在 AIR 播放器之外无法工作。

    但是你可以尝试自己做,因为这个监视器类所做的就是“ping”url并检查响应,所以你可以做类似的尝试从google.com等已知来源加载一些东西,如果它在没有错误的情况下完成那么就OK了,否则会报错。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 2017-03-16
    • 2014-02-08
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2011-04-08
    相关资源
    最近更新 更多