2012-03-16 2 views
1

HttpGet을 사용하여 ping을 구현하려고하지만 동작이 임의적입니다. 그것은 시간이 걸릴 수 있으므로 코드 위HttpGet Android API의 무작위 동작

boolean result = false; 
HttpGet request = new HttpGet("www.MyServer.com"); 
HttpParams httpParameters = new BasicHttpParams(); 
HttpClient httpClient = new DefaultHttpClient(httpParameters); 

try 
{ 
    HttpConnectionParams.setConnectionTimeout(httpParameters, 6000); 
    HttpConnectionParams.setSoTimeout(httpParameters, 6000); 
    HttpResponse response = httpClient.execute(request); 

    int status = response.getStatusLine().getStatusCode(); 

    if (status == HttpStatus.SC_OK) 
    { 
     result = true; 
    } 

} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
    result = false; 
} 

Log.d("App", "Ping Result:"+result); 

내가 스레드에서 실행하고 있습니다 :

나는 인터넷/서버 연결을 테스트 다음 코드를있다. 처음으로이 테스트를 실행하면 결과가 true로 표시되지만 동작이 무작위 인 경우 일부 오류가 발생하여 'host unreachable'오류가 발생하고 결과가 false로 표시됩니다.

저는 현재 구성된 Android 네트워크에서 서버에 연결할 수 있는지 테스트하고 싶습니다.

인터넷/서버 연결을 테스트 할 수있는 신뢰할 수있는 API가 있습니까?

업데이트 : 시험을 개시 한 기능에 따라 서비스에

.

void startTest() 
{ 
    ServerTestThread mServerTestThread = new ServerTestThread() 
    mServerTestThread.start(); 
} 

class ServerTestThread extends Thread 
{ 
    boolean result = false; 
    public void run() 
    { 
     //HttpGet code 

       //Send Message TO GUI Thread with result. 
    } 
} 

startTest 위 기능은 테스트 스레드의 인스턴스를 생성하고 시작 함수를 호출한다. 테스트가 끝나면 결과를 포함하는 메인 스레드로 메시지를 보냅니다.

감사합니다.

답변

2

코드에 문제가 없습니다. 즉, 다음 중 하나를 의미합니다.

1) 때때로 서버에 실제로 도달 할 수 없습니다.
2) 연결이 느리고 서버에 도달하기 전에 시간이 초과됩니다.

따라서 시간 초과를 60000 (60 초)과 같은 더 큰 값으로 설정하고 다시 확인하십시오. 작동하면 시간 초과로 인한 것임을 알 수 있습니다.

편집

또한 어쩌면 그것은 우리에게 더 많은 정보를 제공,이 변경 사항을 확인하시기 바랍니다 :

Log.d("App", "Status:" + status); 
if (status == HttpStatus.SC_OK) 
{ 
    result = true; 
} 

EDIT2

class ServerTestThread extends Thread 
{ 

    public static boolean result = false; 
    public static HttpGet request = new HttpGet("www.MyServer.com"); 
    public static HttpParams httpParameters = new BasicHttpParams(); 
    public static HttpClient httpClient = new DefaultHttpClient(httpParameters); 

    boolean result = false; 
    public void run() 
    { 
     //HttpGet code 

       //Send Message TO GUI Thread with result. 
    } 

} 

EDIT3
이 w를 네트워크에 연결하는 경우 병이 당신인지 알 :

boolean connected = false; 
ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
      connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) { 
    //we are connected to a network 
    connected = true; 
} 

경고 : 당신이 인터넷 접속을 포함하거나 브라우저 기반의 인증을 요구하지 않는 WiFi 네트워크에 연결되어있는 경우, connected 여전히 사실 일 것이다. 답장을 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

+0

감사합니다,하지만 처음으로 작동하는 이유 :

당신은 당신의 매니페스트에이 권한이 필요합니다. 타임 아웃이 적은 경우 처음 실패 할 수도 있습니다. 이 코드가 스레드에서 호출 될 때 어떤 종류의 정리를 추가해야합니까? – User7723337

+0

스레드를 실행하는 방법을 볼 수 있도록 코드를 게시 할 수 있습니까? – Caner

+0

내 업데이트 된 질문을 참조하십시오. – User7723337