您的位置:首页 > 理论基础 > 计算机网络

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

2017-06-04 10:25 357 查看
上次为了解决无网路由器超时的问题,将问题重心转移到了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。

最后祝大家都成为大牛。~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐