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。
最后祝大家都成为大牛。~~~