簡體   English   中英

如何在android中檢查互聯網和服務器(url)的可用性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM