สำหรับผู้ที่กล่าวว่าคำตอบของ @ kuester2000 ใช้งานไม่ได้โปรดทราบว่าการร้องขอ HTTP ก่อนอื่นให้ลองค้นหาโฮสต์ IP ที่มีการร้องขอ DNS จากนั้นทำการร้องขอ HTTP จริงไปยังเซิร์ฟเวอร์ดังนั้นคุณอาจต้องตั้งค่า หมดเวลาสำหรับคำขอ DNS
หากรหัสของคุณทำงานโดยไม่มีการหมดเวลาสำหรับคำขอ DNS นั่นเป็นเพราะคุณสามารถเข้าถึงเซิร์ฟเวอร์ DNS หรือคุณกำลังกดแคช Android DNS โดยวิธีการที่คุณสามารถล้างแคชนี้โดยการรีสตาร์ทอุปกรณ์
รหัสนี้ขยายคำตอบดั้งเดิมเพื่อรวมการค้นหา DNS ด้วยตนเองด้วยการหมดเวลาที่กำหนดเอง:
//Our objective
String sURL = "http://www.google.com/";
int DNSTimeout = 1000;
int HTTPTimeout = 2000;
//Get the IP of the Host
URL url= null;
try {
url = ResolveHostIP(sURL,DNSTimeout);
} catch (MalformedURLException e) {
Log.d("INFO",e.getMessage());
}
if(url==null){
//the DNS lookup timed out or failed.
}
//Build the request parameters
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, HTTPTimeout);
HttpConnectionParams.setSoTimeout(params, HTTPTimeout);
DefaultHttpClient client = new DefaultHttpClient(params);
HttpResponse httpResponse;
String text;
try {
//Execute the request (here it blocks the execution until finished or a timeout)
httpResponse = client.execute(new HttpGet(url.toString()));
} catch (IOException e) {
//If you hit this probably the connection timed out
Log.d("INFO",e.getMessage());
}
//If you get here everything went OK so check response code, body or whatever
วิธีที่ใช้:
//Run the DNS lookup manually to be able to time it out.
public static URL ResolveHostIP (String sURL, int timeout) throws MalformedURLException {
URL url= new URL(sURL);
//Resolve the host IP on a new thread
DNSResolver dnsRes = new DNSResolver(url.getHost());
Thread t = new Thread(dnsRes);
t.start();
//Join the thread for some time
try {
t.join(timeout);
} catch (InterruptedException e) {
Log.d("DEBUG", "DNS lookup interrupted");
return null;
}
//get the IP of the host
InetAddress inetAddr = dnsRes.get();
if(inetAddr==null) {
Log.d("DEBUG", "DNS timed out.");
return null;
}
//rebuild the URL with the IP and return it
Log.d("DEBUG", "DNS solved.");
return new URL(url.getProtocol(),inetAddr.getHostAddress(),url.getPort(),url.getFile());
}
คลาสนี้มาจากบล็อกโพสต์นี้ ไปและตรวจสอบข้อสังเกตว่าคุณจะใช้มัน
public static class DNSResolver implements Runnable {
private String domain;
private InetAddress inetAddr;
public DNSResolver(String domain) {
this.domain = domain;
}
public void run() {
try {
InetAddress addr = InetAddress.getByName(domain);
set(addr);
} catch (UnknownHostException e) {
}
}
public synchronized void set(InetAddress inetAddr) {
this.inetAddr = inetAddr;
}
public synchronized InetAddress get() {
return inetAddr;
}
}