如何在android中检查互联网和服务器(url)的可用性

时间:2014-11-12 14:24:05

标签: java android

我在android中开发了我的天气预报应用程序。在我的应用程序中,当我的互联网无法正常运行或服务器无法访问时(在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();
    }

3 个答案:

答案 0 :(得分:1)

使用以下方法检查互联网是否可用

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。提供以下方法,将其放在与Async Task的doInBackground相同的范围内:

@Override
protected void onPostExecute(String result) {
    // parse your response here and update the UI with the data parsed.
}

答案 1 :(得分:0)

使用此方法。

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

答案 2 :(得分:0)

首先添加一项检查,看看手机是否已连接到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。

这就是为什么你仍然需要检查你是否有互联网,你可以通过向你的服务器或谷歌添加一个简单的ping来实现这一点(因为谷歌有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

相关问题