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); 

を。 初めてこのテストを実行すると、結果は真ですが、動作がランダムになった後、「ホスト到達不能」というエラーが表示され、結果がfalseになることがありました。

私はちょうどサーバが現在設定されているAndroidネットワークから到達可能であることをテストしたいです。

インターネット/サーバー接続をテストするための信頼できるAPIはありますか?

UPDATE:私はテストを開始機能を以下しているサービスで

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
このワット:

EDIT

はまた、この変更を行ってください、多分それは私たちに多くの情報を提供しますあなたがネットワークに接続している場合は病気あなたどうか:

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はまだtrueになります。返信用 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

+0

おかげで、それは最初の時間のために働く理由:

あなたのマニフェストにこの権限が必要になります。タイムアウトが少ない場合は、初めて失敗することもあります。このコードがスレッドで呼び出されているので、何らかのクリーンアップを追加する必要がありますか? – User7723337

+0

スレッドを実行する方法を見るので、コードを投稿できますか? – Caner

+0

最新の質問をご覧ください。 – User7723337

関連する問題