[英]how to check availability of internet and server(url) in android
我已經在android中開發了用於天氣預報的應用程序。 在我的應用程序中,當我的Internet無法正常工作或服務器無法訪問(通過URL給出)時,應用程序崩潰,並顯示消息"Unfortunately, application is stopped"
。 我在這里發布了我的代碼。 我不知道該在哪里處理該異常。 請幫助我..提前謝謝...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(isNetworkAvailable())
{
setContentView(R.layout.activity_location);
weatherlist = new ArrayList<HashMap<String, String>>();
// Getting complete weather details in background thread
new GetWeatherDetails().execute();
new GetWeatherDetails1().execute();
// Get listview
ListView lv = getListView();
// on seleting single product
// launching Edit Product Screen
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String FC_DATE = ((TextView) view.findViewById(R.id.fc_date)).getText()
.toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(),
ForecastActivity.class);
// sending pid to next activity
in.putExtra(TAG_FC_DATE, FC_DATE);
in.putExtra(TAG_LAT, LAT);
in.putExtra(TAG_LONG, LONGITUDE);
// starting new activity and expecting some response back
startActivityForResult(in, 100);
}
});
}
else
{
Toast.makeText(this, "Network unavailable", Toast.LENGTH_SHORT).show();
}
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
// dismiss the dialog after getting all products
pDialog.dismiss();
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
LocationActivity.this, weatherlist,
R.layout.list_item, new String[] { TAG_FC_DATE},
new int[] { R.id.fc_date });
// updating list view
setListAdapter(adapter);
}
});
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
使用以下方法檢查互聯網是否可用
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
然后像這樣調用它並向您的用戶顯示一條消息。 我包含了一個Toast,但您可能需要使用某種對話框
if (isNetworkAvailable())
{
// do your request
}
else
{
Toast.makeText(this, "Network unavailable", Toast.LENGTH_SHORT).show();
}
為了使getActiveNetworkInfo()正常工作,您需要將以下權限添加到清單文件中。
uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
另外,在執行異步任務時,應該在AsyncTask類的onPostExecuted方法中更新UI。 提供以下方法,將其置於與異步任務的doInBackground相同的范圍內:
@Override
protected void onPostExecute(String result) {
// parse your response here and update the UI with the data parsed.
}
使用此方法。
public static boolean isInternetAvailable(Context ctx) {
ConnectivityManager cm = (ConnectivityManager) ctx
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()
&& cm.getActiveNetworkInfo().isAvailable()
&& cm.getActiveNetworkInfo().isConnected()) {
return true;
} else {
return false;
}
}
首先添加檢查以查看電話是否已連接到Netwerk。
您可以使用以下代碼執行此操作;
public boolean isNetwork() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
if (isNetwork()) {
// do your request && server ping !!
} else {
Toast.makeText(this, "Not connected to a network", Toast.LENGTH_SHORT).show();
}
還要向AndroidManifest.xml添加以下權限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
但是,它可能返回假陽性,例如,如果電話通過強制門戶或vpn連接到WiFi網絡,則此功能將錯誤地返回true。
這就是為什么您仍然需要檢查是否有互聯網,可以通過向服務器或Google添加簡單的ping操作來完成此操作(因為Google的使用率高達99,99%)。
像這樣的東西;
public boolean isNetwork() {
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
public Boolean isInternet() {
try {
Process process = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = process.waitFor();
boolean reachable = (returnVal==0);
return reachable
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
if (isNetwork()) {
if (isInternet()) {
// do your request
} else {
Toast.makeText(this, "No internet connection", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(this, "Not connected to a network", Toast.LENGTH_SHORT).show();
}
最后不要忘記,當您執行異步任務時,可以在onPostExecute方法中更新GUI。 您不要在doInBackground中調用runOnUiThread()。
一些說明文件;
http://developer.android.com/reference/android/os/AsyncTask.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.