• http自己定义超时检測方法、主动抛出异常


    上次为了解决无网路由器超时的问题,将问题重心转移到了HttpClient、 HttpUrLConnection上面,什么各种设置ReadTimeout、 connectionTimeOut,还有所谓的HttpParameters,最后均以失败告终。我也去网上搜了好多类似的东西。也见到非常多人这类问题的解决方式,但是都没有看到真正的解决方法。后来。。

     好了,废话不多说直接上代码。

    class BaiduHttpCallable implements Callable<Boolean> {

        private GetUrlFromServerCallBack listener;
        BaiduHttpCallable(GetUrlFromServerCallBack listener) {
            this.listener = listener;
        }

        @Override
        public Boolean call() throws Exception {
            HttpURLConnection conn = null;
            try {
                URL url = new URL("http://www.baidu.com");
                conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000);
                conn.connect();
                int responseCode = conn.getResponseCode();
                if (responseCode == 200) {
                    listener.onRequestSuccess("wocao");
                } else {
                   listener.onNetError();
                }
            } catch (Exception e) {
                listener.onNetError();
            }
            Log.e("luomz", "over");
            return true;
    }
        public static  void testConnection(GetUrlFromServerCallBack listener) { 
            FutureTask<Boolean> testConnectionTask = new FutureTask<Boolean>(new BaiduHttpCallable(listener));
            new Thread(testConnectionTask).start();
            try {
                 testConnectionTask.get(1, TimeUnit.SECONDS);
            } catch (Exception e) {
                //do something
                Log.e("luomz", "time out");
                listener.onNetTimeOut();
            }
    }

        
        
        public interface GetUrlFromServerCallBack {
            public void onNetError();

            public void onNetTimeOut();

            public void onRequestSuccess(String result);
        }


    上面的红色部分事实上是最中心的处理办法。利用FutureTask的堵塞检索主动抛出异常来解决本质问题。

    近期身体不太好 头有点晕,语言组织的相当粗糙,只是能解决这个问题才是最重要的。

    事实上那些setTimeOut之类的能够捕获到异常。可是前提能过一个域名检測的阶段(无网路由器就是过不了这里才一直堵塞导致你设置的超时方法无效)

    鄙人也是刚入android半年,希望有问题大家一起学习,一起交流。


    本人新建QQ群 99185354   期待技术男一起共同进步!


    測试demo也不用给了,就直接调用里面的静态方法就能够了,这仅仅是提供一个思路。假设多线程同期监控的话 最好加上synchronized

    最后祝大家都成为大牛。~~~


  • 相关阅读:
    DataSet数据导出为Excel文档(每个DataTable为一个Sheet)
    K2 Blackpearl 4.6.8 安装步骤详解
    解决未能从程序集xxx中加载类型System.ServiceModel.Activation.HttpModule的问题
    将博客搬至CSDN
    PMS-授权中心
    如何从现有版本1.4.8升级到element UI2.0.11
    Maven私有仓库: 发布release版本报错:Return code is: 400, ReasonPhrase: Repository does not allow upd ating assets: maven-releases.
    spring boot + dubbo开发遇到过的异常
    java,javascript中的url编码
    SpringBoot favicon.ico
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6939689.html
Copyright © 2020-2023  润新知