這個SSCCE應用程序的想法是,當MainActivity被創建(即在onCreate())期間,我們檢查設備是否連接到互聯網。如果不是,則顯示AlertDialog
說"Please check your internet connection"
。爲什麼我的設備在連接到WIFI時似乎沒有連接到互聯網?
在此if
塊中,存在一個while循環,它在互聯網連接重新獲得時執行。
問題是,即使當我的模擬器連接到主機連接到的無線網絡,我的手機也連接到無線網絡(我也在真實手機上測試過)時,它始終顯示對話框。問題是爲什麼,我該如何解決這個問題。
的另一個問題是,一些奇怪的例外是在logcat中提出的,它ddoes註銷信息"THE NETWORK IS NOW AVAILABLE"
檢查(見代碼,看看這張支票是什麼)的
有關部分SSCCE
MainActivity.java
public class MainActivity extends FragmentActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate of MainActivity called.");//check
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.mainActivity_textView);
if (!hasInternetAccess(this)) {
InternetDisconnectedDialogFragment internetDisconnectedDialogFragment = new InternetDisconnectedDialogFragment();
internetDisconnectedDialogFragment.show(getSupportFragmentManager(),
"practice_projects.minimal_alert_dialog.InternetDisconnectedDialogFragment");
while (hasInternetAccess(this)) {
Log.i(TAG, "Checking internet connection...");
textView.setBackgroundColor(Color.parseColor("#FACC2E"));
internetDisconnectedDialogFragment.dismiss();
}
}
}
public static boolean hasInternetAccess(Context context) {
Log.i(TAG, "hasInternetAccess of MainActivity called.");//check
if (isNetworkAvailable(context)) {
try {
HttpURLConnection urlc = (HttpURLConnection) (new URL("http://google.com").openConnection());
//HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204").openConnection());
urlc.setRequestProperty("User-Agent", "Android");
urlc.setRequestProperty("Connection", "close");
urlc.setConnectTimeout(1500);
urlc.connect();
return (urlc.getResponseCode() == 204 && urlc.getContentLength() == 0);
} catch (IOException e) {
Log.e(TAG, "Error checking internet connection", e);
}
Log.i(TAG, "THE NETWORK IS NOW AVAILABLE");
} else {
Log.d(TAG, "No network available!");
}
return false;
}
private static boolean isNetworkAvailable(Context context) {
Log.i(TAG, "isNetworkAvailable of MainActivity called.");//check
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null;
}
}
InternetConnectedDialogFragment.java
public class InternetDisconnectedDialogFragment extends DialogFragment{
private static final String TAG = InternetDisconnectedDialogFragment.class.getSimpleName();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.i(TAG, "onCreateDialog of InternetDisconnectedDialogFragment called.");//check
//Builder class is used for "convenient" dialog construction.
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
alertDialogBuilder.setMessage(R.string.internetDisconnectedDialogMessage);
alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, "onClick of an anonymous class in InternetDisconnectedDialogFragment called.");//check
InternetDisconnectedDialogFragment.this.dismiss();
}
});
return alertDialogBuilder.create();
}
}
logcat的
08-16 02:03:46.778: I/MainActivity(279): onCreate of MainActivity called.
08-16 02:03:46.824: I/MainActivity(279): hasInternetAccess of MainActivity called.
08-16 02:03:46.824: I/MainActivity(279): isNetworkAvailable of MainActivity called.
08-16 02:03:46.898: E/MainActivity(279): Error checking internet connection
08-16 02:03:46.898: E/MainActivity(279): java.net.SocketException: Permission denied
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
08-16 02:03:46.898: E/MainActivity(279): at java.net.Socket.checkClosedAndCreate(Socket.java:873)
08-16 02:03:46.898: E/MainActivity(279): at java.net.Socket.connect(Socket.java:1020)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
08-16 02:03:46.898: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
08-16 02:03:46.898: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.hasInternetAccess(MainActivity.java:50)
08-16 02:03:46.898: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.onCreate(MainActivity.java:29)
08-16 02:03:46.898: E/MainActivity(279): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-16 02:03:46.898: E/MainActivity(279): at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 02:03:46.898: E/MainActivity(279): at android.os.Looper.loop(Looper.java:123)
08-16 02:03:46.898: E/MainActivity(279): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-16 02:03:46.898: E/MainActivity(279): at java.lang.reflect.Method.invokeNative(Native Method)
08-16 02:03:46.898: E/MainActivity(279): at java.lang.reflect.Method.invoke(Method.java:521)
08-16 02:03:46.898: E/MainActivity(279): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-16 02:03:46.898: E/MainActivity(279): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-16 02:03:46.898: E/MainActivity(279): at dalvik.system.NativeStart.main(Native Method)
08-16 02:03:46.898: I/MainActivity(279): THE NETWORK IS NOW AVAILABLE
08-16 02:03:46.918: I/MainActivity(279): hasInternetAccess of MainActivity called.
08-16 02:03:46.918: I/MainActivity(279): isNetworkAvailable of MainActivity called.
08-16 02:03:46.978: E/MainActivity(279): Error checking internet connection
08-16 02:03:46.978: E/MainActivity(279): java.net.SocketException: Permission denied
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocketImpl(Native Method)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.platform.OSNetworkSystem.createStreamSocket(OSNetworkSystem.java:186)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.net.PlainSocketImpl.create(PlainSocketImpl.java:265)
08-16 02:03:46.978: E/MainActivity(279): at java.net.Socket.checkClosedAndCreate(Socket.java:873)
08-16 02:03:46.978: E/MainActivity(279): at java.net.Socket.connect(Socket.java:1020)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
08-16 02:03:46.978: E/MainActivity(279): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
08-16 02:03:46.978: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.hasInternetAccess(MainActivity.java:50)
08-16 02:03:46.978: E/MainActivity(279): at practice_projects.minimal_alert_dialog_for_internet_disconnect.MainActivity.onCreate(MainActivity.java:33)
08-16 02:03:46.978: E/MainActivity(279): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-16 02:03:46.978: E/MainActivity(279): at android.os.Handler.dispatchMessage(Handler.java:99)
08-16 02:03:46.978: E/MainActivity(279): at android.os.Looper.loop(Looper.java:123)
08-16 02:03:46.978: E/MainActivity(279): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-16 02:03:46.978: E/MainActivity(279): at java.lang.reflect.Method.invokeNative(Native Method)
08-16 02:03:46.978: E/MainActivity(279): at java.lang.reflect.Method.invoke(Method.java:521)
08-16 02:03:46.978: E/MainActivity(279): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-16 02:03:46.978: E/MainActivity(279): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-16 02:03:46.978: E/MainActivity(279): at dalvik.system.NativeStart.main(Native Method)
08-16 02:03:46.978: I/MainActivity(279): THE NETWORK IS NOW AVAILABLE
08-16 02:03:46.978: I/InternetDisconnectedDialogFragment(279): onCreateDialog of InternetDisconnectedDialogFragment called.
08-16 02:03:47.028: I/dalvikvm(279): Could not find method android.view.Window$Callback.dispatchGenericMotionEvent, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.dispatchGenericMotionEvent
08-16 02:03:47.028: W/dalvikvm(279): VFY: unable to resolve interface method 13410: Landroid/view/Window$Callback;.dispatchGenericMotionEvent (Landroid/view/MotionEvent;)Z
08-16 02:03:47.028: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.038: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.dispatchGenericMotionEvent (Landroid/view/MotionEvent;)Z
08-16 02:03:47.038: I/dalvikvm(279): Could not find method android.view.Window$Callback.dispatchKeyShortcutEvent, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.dispatchKeyShortcutEvent
08-16 02:03:47.038: W/dalvikvm(279): VFY: unable to resolve interface method 13412: Landroid/view/Window$Callback;.dispatchKeyShortcutEvent (Landroid/view/KeyEvent;)Z
08-16 02:03:47.038: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.048: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.dispatchKeyShortcutEvent (Landroid/view/KeyEvent;)Z
08-16 02:03:47.048: W/dalvikvm(279): VFY: unable to find class referenced in signature (Landroid/view/ActionMode;)
08-16 02:03:47.048: I/dalvikvm(279): Could not find method android.view.Window$Callback.onActionModeFinished, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onActionModeFinished
08-16 02:03:47.058: W/dalvikvm(279): VFY: unable to resolve interface method 13416: Landroid/view/Window$Callback;.onActionModeFinished (Landroid/view/ActionMode;)V
08-16 02:03:47.058: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.058: D/dalvikvm(279): VFY: dead code 0x0005-0005 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.onActionModeFinished (Landroid/view/ActionMode;)V
08-16 02:03:47.068: W/dalvikvm(279): VFY: unable to find class referenced in signature (Landroid/view/ActionMode;)
08-16 02:03:47.068: I/dalvikvm(279): Could not find method android.view.Window$Callback.onActionModeStarted, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onActionModeStarted
08-16 02:03:47.068: W/dalvikvm(279): VFY: unable to resolve interface method 13417: Landroid/view/Window$Callback;.onActionModeStarted (Landroid/view/ActionMode;)V
08-16 02:03:47.068: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.079: D/dalvikvm(279): VFY: dead code 0x0005-0005 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.onActionModeStarted (Landroid/view/ActionMode;)V
08-16 02:03:47.079: I/dalvikvm(279): Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.internal.view.WindowCallbackWrapper.onWindowStartingActionMode
08-16 02:03:47.079: W/dalvikvm(279): VFY: unable to resolve interface method 13430: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;
08-16 02:03:47.079: D/dalvikvm(279): VFY: replacing opcode 0x72 at 0x0002
08-16 02:03:47.088: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/view/WindowCallbackWrapper;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;
08-16 02:03:47.108: I/AppCompatDelegate(279): The Activity's LayoutInflater already has a Factory installed so we can not install AppCompat's
08-16 02:03:47.208: I/dalvikvm(279): Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
08-16 02:03:47.218: W/dalvikvm(279): VFY: unable to resolve virtual method 408: Landroid/content/res/TypedArray;.getChangingConfigurations()I
08-16 02:03:47.218: D/dalvikvm(279): VFY: replacing opcode 0x6e at 0x0002
08-16 02:03:47.218: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/widget/TintTypedArray;.getChangingConfigurations()I
08-16 02:03:47.228: I/dalvikvm(279): Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
08-16 02:03:47.228: W/dalvikvm(279): VFY: unable to resolve virtual method 430: Landroid/content/res/TypedArray;.getType (I)I
08-16 02:03:47.228: D/dalvikvm(279): VFY: replacing opcode 0x6e at 0x0002
08-16 02:03:47.228: D/dalvikvm(279): VFY: dead code 0x0005-0006 in Landroid/support/v7/internal/widget/TintTypedArray;.getType (I)I