我在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();
}
答案 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