【问题标题】:Android: Show AlertDialog as soon as internet is disconnected [duplicate]Android:一旦互联网断开就显示 AlertDialog [重复]
【发布时间】:2015-02-25 10:38:00
【问题描述】:

我有一个必须连接互联网的应用程序。所以,我想要的是,每当用户与 Internet(Wifi 或移动设备)断开连接时,Activity 应该能够检测到网络状态并应该显示一个AlertDialog 提示用户检查其连接。我曾尝试使用广播接收器来实现这一点,但我的应用程序崩溃了。以下是相同的代码sn-p:

以下代码在onCreate()方法中

  c = this.getApplicationContext();
  broadcastReceiver = new BroadcastReceiver() {

    AlertDialog.Builder builder;

    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetInfo = connectivityManager
                .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo activeNetWifi = connectivityManager
                .getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        boolean isConnectedMobile = activeNetInfo != null
                && activeNetInfo.isConnectedOrConnecting();
        boolean isConnectedWifi = activeNetWifi != null
                && activeNetWifi.isConnectedOrConnecting();
        AlertDialog alert = alertNoNetwork();
        if (isConnectedMobile || isConnectedWifi) {
            if (alert != null && alert.isShowing()) {
                alert.dismiss();
            }
        } else {
            if (alert != null && !alert.isShowing()) {
                alert.show();
            }
        }

    }

    public AlertDialog alertNoNetwork() {
        builder = new AlertDialog.Builder(c);
        builder.setMessage(R.string.err_network_failure_title)
                .setMessage(R.string.err_network_failure_message)
                .setCancelable(false)
                .setPositiveButton("Quit",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {

                            }
                        });
        return builder.create();
    }
};

将c 和broadcastReceiver 声明为:

private Context c;  
private BroadcastReceiver broadcastReceiver ;

并在onResume()方法中注册broadcastReceiver:

registerReceiver(broadcastReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));

我的错误日志是:

02-25 15:53:35.836: E/AndroidRuntime(24768): java.lang.RuntimeException: 在 com.例子.ActivityCapturImg$1@1bca6ea7 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:880) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.os.Handler.handleCallback(Handler.java:739) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.os.Handler.dispatchMessage(Handler.java:95) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.os.Looper.loop(Looper.java:135) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.app.ActivityThread.main(ActivityThread.java:5312) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 java.lang.reflect.Method.invoke(Native Method) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 java.lang.reflect.Method.invoke(Method.java:372) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 02-25 15:53:35.836: E/AndroidRuntime(24768): 由: android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.view.ViewRootImpl.setView(ViewRootImpl.java:583) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.app.Dialog.show(Dialog.java:298) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 com.swachhmap.ActivityCapturImg$1.onReceive(ActivityCapturImg.java:235) 02-25 15:53:35.836: E/AndroidRuntime(24768): 在 android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:870) 02-25 15:53:35.836: E/AndroidRuntime(24768): ... 8 更多

请帮忙。

谢谢, 阿皮特

编辑:在AlertDialog.Builder 中传递的Context c 应该是

 c = ActivityName.this;

而不是getApplicationContext()

【问题讨论】:

  • 您不能从活动以外的组件中显示对话框。您需要显示 Activity-as-dialog。

标签: android broadcastreceiver android-alertdialog


【解决方案1】:

android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 null 不适用于应用程序

因为在AlertDialog.Builder 中传递了getApplicationContext()

AlertDialog.Builder 需要当前活动组件上下文而不是应用程序上下文。

使用调用Dialog.show()的Activity上下文创建AlertDialog.Builder对象:

builder = new AlertDialog.Builder(CurrentActivityName.this);

【讨论】:

  • 谢谢,我也想通了:)
猜你喜欢
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2021-11-12
  • 1970-01-01
  • 2017-11-30
  • 2012-03-23
相关资源
最近更新 更多