2013-01-06 508 views
1

我正在運行一個Android應用程序,該應用程序在特定URL上顯示webview,我想檢查我正在訪問的應用程序服務器是否還活着,並且我可以查看HTML,如果失敗,我應該終止webview,這個檢查應該是每10秒(或其他),對此最好的方法是什麼?Android定期檢查互聯網連接

+1

我認爲服務可以幫助你。 –

回答

2

創建定時器(here you have information)當計時器滴答,平任何主機:

URL url = new URL("http://microsoft.com"); 

    HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
    urlc.setRequestProperty("User-Agent", "Android Application:"+Z.APP_VERSION); 
    urlc.setRequestProperty("Connection", "close"); 
    urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds 
      urlc.connect(); 
    if (urlc.getResponseCode() == 200) { 
     Main.Log("getResponseCode == 200"); 
      return new Boolean(true); 
    } 
    } catch (MalformedURLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
} catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 

如果返回true:連接處於活動狀態。否則不活躍。

1

最好的方法是使用AsyncTask,這樣你的應用就不會凍結。

private class checkServer extends AsyncTask<Integer, Integer, Void> { 

     @Override 
     protected Void doInBackground(Integer... params) { 
      questionRunning = true; 

      //check if server is running 

      //now wait 10.000ms (10sec) 
      try { 
       Thread.sleep(params[0]); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // Update your layout here 
      super.onPostExecute(result); 

      //Do it again! 
      new checkServer().execute(10000); 

     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 

     } 
    } 

如何叫你的AsynTask:

new checkServer().execute(10000); 
+0

我想過這種方式,但認爲它不是異步任務的預期用途,它是關於進度和UI,並且每秒鐘初始化一個新的asynctask效率不夠高,或者您認爲如何? –

+0

您必須使用新的威脅,否則您的主要威脅會凍結幾個(mili)秒。你不希望發生這種事!你可以使用AsyncTask和Timer來解決這個問題。當你創建一個計時器時,你也開始一個新的威脅,一個Asynctask針對Android進行了優化,所以我認爲這是一個很好的解決方案。 – ObAt

+0

啊哈我知道了,我會試試 –

1

使用-BroadcastReceiver的路,這是高效的,易於實施&現實

As you're saying that you need to check the specific server for alive() or not?. Then it depends upon your choice. But always try to be general.

要接收爲國際米蘭淨連接數降低/增加,監聽 'ConnectivityManager.CONNECTIVITY_ACTION'操作。

IntentFilter filter = new IntentFilter(); 
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
getApplicationContext().registerReceiver(mNetworkStateIntentReceiver, filter); 

每當有連通性,即它可以是數據連接,連接或斷開的變化,您將收到此事件爲廣播,所以在廣播接收器的onReceive,請檢查internetconnect連接和決定互聯網是否啓動或關閉。

 BroadcastReceiver mNetworkStateIntentReceiver = new BroadcastReceiver() 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
     if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) 
     { 

      NetworkInfo info = intent.getParcelableExtra( 
        ConnectivityManager.EXTRA_NETWORK_INFO); 
      String typeName = info.getTypeName(); 
      String subtypeName = info.getSubtypeName(); 
       System.out.println("Network is up ******** "+typeName+":::"+subtypeName); 

      if(checkInternetConnection()== true) 
      { 
        "Decide your code logic here...." 
       } 
      } 
     } 
     } 

private boolean checkInternetConnection() 
{ 
ConnectivityManager conMgr = (ConnectivityManager) mContext.getSystemService(mContext.CONNECTIVITY_SERVICE); 
// ARE WE CONNECTED TO THE NET 
if (conMgr.getActiveNetworkInfo() != null && conMgr.getActiveNetworkInfo().isAvailable() &&conMgr.getActiveNetworkInfo().isConnected()) 
    { 
    return true; 
    } 
else 
    { 
    return false; 
    }  
} 

希望它可以幫助你的地方!

+0

我知道關於連接管理器,並已經使用它來檢查一般的互聯網連接,但在我的情況下,我想特意檢查我們的服務器,謝謝 –