Hallo leude,
ich bin es mal wieder. Hmm.. also ich beschäftige mich gerade mit dem Problem, wie ich mit einer App überprüfen kann ob ein Server online ist. Die Anwendung selbst greift nämlich auf eine webservice zu. Und falls dieser nicht online sein sollte, habe ich mir überlegt, dass die anwendung so früh wie möglich den user informieren soll (z.B. mit einem AlertBox mit der message das der Service gerade nicht genutzt werden kann, da keine Verbindung zum Server hergestellt werden kann). Allerdings bekomme ich stets eine NullPointerException wenn ich die app ausführe. Die Verbindung zu dem webservice wird erst über einen menübutton ausgeführt. was ich möchte ist, das während die activity aufgebaut wird oder ist, dann überprüft werden soll, ob überhaupt eine Verbindung hergestellt werden kann. Ich bin folgendermaßen vorgegangen:
public class MainActivity extends FragmentActivity {
....
....
public boolean isServerReachable() {
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = connMgr.getActiveNetworkInfo();
String website = "http://....";
URL url = null;
// check the network availability
// if no network is available networkInfo will be null
// otherwise check if we are connected
if (netInfo != null && netInfo.isConnected()) {
//check if server is reachable
try {
url = new URL(website);
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(5000); // 5 seconds timeout in milliseconds
urlc.connect();
if (urlc.getResponseCode() == 200) { // HTTP-Statuscode: siehe wikipedia
Log.e("Service", "Service is available");
return true;
}
else {
Log.e("NO INTERNET", "NO INTERNET");
return false;
}
} catch (IOException e) {
Log.e("TAG", e.getMessage());
return false;
}
}
else {
return false;
}
}
....
....
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if(isServerReachable() == false) {
showServerUnreachableMessage();
}
}
....
....
@SuppressWarnings("deprecation")
public void showServerUnreachableMessage() {
errorDialog = new AlertDialog.Builder(MainActivity.this).create();
// Setting Dialog Title
errorDialog.setTitle("Connection Error!");
// Setting Dialog Message
errorDialog.setMessage("Verbindung konnte nicht hergestellt werden");
// Setting the error-icon
errorDialog.setIcon(R.drawable.error);
// Setting OK Button
errorDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
exitApplication();
}
});
// Showing Alert Message
errorDialog.show();
}
Alles anzeigen
log-Ausgabe:
03-28 17:52:34.623: E/AndroidRuntime(10345): FATAL EXCEPTION: main
03-28 17:52:34.623: E/AndroidRuntime(10345): java.lang.RuntimeException: Unable to resume activity {com.example.testproject/com.example.testproject.MainActivity}: java.lang.NullPointerException
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2639)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2667)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2140)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread.access$700(ActivityThread.java:140)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.os.Looper.loop(Looper.java:137)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread.main(ActivityThread.java:4921)
03-28 17:52:34.623: E/AndroidRuntime(10345): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 17:52:34.623: E/AndroidRuntime(10345): at java.lang.reflect.Method.invoke(Method.java:511)
03-28 17:52:34.623: E/AndroidRuntime(10345): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-28 17:52:34.623: E/AndroidRuntime(10345): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-28 17:52:34.623: E/AndroidRuntime(10345): at dalvik.system.NativeStart.main(Native Method)
03-28 17:52:34.623: E/AndroidRuntime(10345): Caused by: java.lang.NullPointerException
03-28 17:52:34.623: E/AndroidRuntime(10345): at com.example.testproject.MainActivity.isServerReachable(MainActivity.java:109)
03-28 17:52:34.623: E/AndroidRuntime(10345): at com.example.testproject.MainActivity.onResume(MainActivity.java:443)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1199)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.Activity.performResume(Activity.java:5280)
03-28 17:52:34.623: E/AndroidRuntime(10345): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2629)
03-28 17:52:34.623: E/AndroidRuntime(10345): ... 12 more
Alles anzeigen
Habe das in die onResume-Methode gepackt und bekomme daher die Fehlermeldung. WEnn das die onCreate-Methode wäre dann hätte ich die Fehlermeldung verstanden, aber auch bei der onResume??
Wie gesagt möchte ich, wenn die App sozusagen geladen wird, die überprüfung stattfindet. Mal abgesehen davon, bin ich mir auch nicht mal sicher, ober die isServerReachable()-Methode korrekt ist. Könnte man die überprüfung während eines splashscreens durchführen?
Danke im voraus für die antworten
PS: verzeiht die rechtschreibfehler. habe schnell geschrieben