当前位置: 首页 > 知识库问答 >
问题:

Android ConnectivityManager NetworkCallback崩溃

吉俊德
2023-03-14

我是Android世界的新手(既是用户也是开发人员),我的Android应用程序在执行myWebView时崩溃。加载URL(“https://www.google.com)但我不明白为什么。。。

目标是在应用程序运行时监控互联网连接:如果连接丢失-

这是我的应用程序代码:

显示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.dedalos.amb">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SplashScreen" android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主要活动

public class MainActivity extends AppCompatActivity {

    // WEB VIEW
    WebView myWebView = null;

    // NETWORK MONITORING
    Boolean isInternetConnected = false;
    ConnectivityManager.NetworkCallback networkCallback = null;
    ConnectivityManager connectivityManager = null;



    //////////////////// OVERRIDE ////////////////////

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        hideSystemUI();

        SharedPreferences prefs = getPreferences(MODE_PRIVATE);
        if (getToken().equals("")) {
            String uniqueID = UUID.randomUUID().toString();
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString("token", uniqueID);
            editor.commit();
        }

        creaWebView();
        configuraWebView();

        initNetworkCallback();

    }

    @Override
    public void onResume() {
        super.onResume();

        if (myWebView == null) {
            creaWebView();
            configuraWebView();
        }

        if (networkCallback == null || connectivityManager == null)
            initNetworkCallback();

        isInternetConnected = (new ConnectionDetector(this).isConnectingToInternet());

        startNetworkMonitoring();

        if (isInternetConnected) {
            caricaWebView();
        }
        else {
            MyWebViewClient.loadError(myWebView);
        }

    }

    @Override
    public void onPause() {
        super.onPause();

        stopNetworkMonitoring();
    }



    private void creaWebView() {
        if (myWebView == null) {
            myWebView = (WebView) findViewById(R.id.ambWebViewLayout);
        }
    }
    private void configuraWebView() {
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.setWebViewClient(new MyWebViewClient());
    }
    private void caricaWebView() {
        if (myWebView == null) {
            creaWebView();
            configuraWebView();
        }
        myWebView.loadUrl("https://www.google.com");
    }

    private void initNetworkCallback() {
        networkCallback = new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                if (!isInternetConnected) {
                    isInternetConnected = true;
                    caricaWebView();
                }

            }

            @Override
            public void onLost(Network network) {
                if (isInternetConnected) {
                    isInternetConnected = false;
                    MyWebViewClient.loadError(myWebView);
                }
            }
        };

        connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);

    }
    private void startNetworkMonitoring() {
        if (networkCallback == null)
            initNetworkCallback();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            connectivityManager.registerDefaultNetworkCallback(networkCallback);
        }
        else {
            NetworkRequest request = new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
            connectivityManager.registerNetworkCallback(request, networkCallback);
        }

    }
    private void stopNetworkMonitoring() {
        connectivityManager.unregisterNetworkCallback(networkCallback);
    }

    private String getToken() {
        return getPreferences(MODE_PRIVATE).getString("token", "");
    }

    private void hideSystemUI() {

        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE
                        // Set the content to appear under the system bars so that the
                        // content doesn't resize when the system bars hide and show.
                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                        // Hide the nav bar and status bar
                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

    }

}

MyWebViewClient

public class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        if (url.startsWith("https://www.google.com")) {
            view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        }
        else {
            return false;
        }

    }

    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        super.onReceivedError(view, request, error);

        if (error.getErrorCode() == -2) {
            loadError(view);
        }
        else {
            // TODO
        }

    }

    public static void loadError(WebView view) {

        String html =   "<!DOCTYPE HTML>\n" +
                        "<html>\n" +
                        "<head>\n" +
                        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
                        "<title>APP</title>\n" +
                        "</head>\n" +
                        "<body style=\"background:#e11020;font-family:Arial,Helvetica;\">\n" +
                        "<h1 style=\"color:rgba(255,255,255,0.9);text-align:center;padding:120px 20px 20px 20px;font-size:30px;\">No Internet connection</h1>\n" +
                        "</body>\n" +
                        "</html>";

        view.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);

    }
}

连接检测器

public class ConnectionDetector {

    private Context mContext;

    public ConnectionDetector(Context context) {
        this.mContext = context;
    }

    /**
     * Checking for all possible internet providers
     * **/
    public boolean isConnectingToInternet() {
        ConnectivityManager connectivityManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Network[] networks = connectivityManager.getAllNetworks();
            NetworkInfo networkInfo;
            for (Network mNetwork : networks) {
                networkInfo = connectivityManager.getNetworkInfo(mNetwork);
                if (networkInfo.getState().equals(NetworkInfo.State.CONNECTED)) {
                    return true;
                }
            }
        }
        else {
            if (connectivityManager != null) {
                //noinspection deprecation
                NetworkInfo[] info = connectivityManager.getAllNetworkInfo();
                if (info != null) {
                    for (NetworkInfo anInfo : info) {
                        if (anInfo.getState() == NetworkInfo.State.CONNECTED) {
                            return true;
                        }
                    }
                }
            }
        }

        return false;
    }
}

提前谢谢


共有1个答案

吕俊才
2023-03-14

根据这一点,您需要在UI线程上调用所有与视图相关的方法。只需在UI线程上加载url,如下所示:

myWebView.post(new Runnable() {
    @Override
    public void run() {
        myWebView.loadUrl("https://www.google.com");
    }
});

您还需要以同样的方式加载错误html,例如:

view.post(new Runnable() {
    @Override
    public void run() {
        String html =   "<!DOCTYPE HTML>\n" +
                "<html>\n" +
                "<head>\n" +
                "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n" +
                "<title>APP</title>\n" +
                "</head>\n" +
                "<body style=\"background:#e11020;font-family:Arial,Helvetica;\">\n" +
                "<h1 style=\"color:rgba(255,255,255,0.9);text-align:center;padding:120px 20px 20px 20px;font-size:30px;\">No Internet connection</h1>\n" +
                "</body>\n" +
                "</html>";

        view.loadDataWithBaseURL(null, html, "text/html", "UTF-8", null);
    }
});
 类似资料:
  • 我试图在solaris机箱中使用远程Weblogic服务器配置jProfiler。服务器正常启动,但是当我将jProfiler GUI连接到服务器时,出现以下错误,服务器崩溃。tmp目录具有足够的访问权限和空间。我可以看到一些文件,比如jpcOYaysx,是在tmp目录中创建的。有人能帮我解决这个问题吗?我们是否有特定于jProfiler的日志,如何配置它? 我找不到任何帮助页面/文档编辑jPro

  • 问题内容: 在Swift,iOS 8,Xcode 6 Beta 6中,我从tableView中删除一行时遇到了一些麻烦。每次尝试删除一行时,都会出现以下错误: / [UITableView _endCellAnimationsWithContext:],/ SourceCache / UIKit_Sim / UIKit-3302.3.1 / UITableView.m:1581 2014-08-3

  • 问题内容: 今天在工作中,我的日食开始反复崩溃。只需打开它并开始编辑文件,几分钟后即可崩溃。我重新安装了所有内容:Eclipse,Workspace,Java,但没有任何帮助。由于我目前无法工作,请尝试确定问题的根源。 (…) 问题答案: 这是C2编译器中的一个已知JVM错误:JDK-8154831。 尝试添加以下JVM参数:

  • 仅供参考;这不需要回答。 我在一个负载很重的Postgres服务器上工作,发出了一个挂起的GRANT命令。它没有被任何其他命令阻止。我有几个打开的连接,并且能够用一个普通的pg_cancel_backend(SIGTERM)命令杀死几个进程,但我的GRANT命令没有响应该命令或pg_ terminate_backde(SIGINT)。我最后尝试了“kill-9(pid)”(SIGKILL),服务器

  • Project My Application11在运行Gradle时使用以下JDK位置:C:/Program Files/Android/Android Studio1/jre在不同进程上使用不同的JDK位置可能会导致Gradle生成多个守护进程,例如,在使用Android Studio时从终端执行Gradle任务。更多信息。。。 显示此错误后自动关闭而不显示任何错误。 尝试了jdk 8和13,并

  • 崩溃(Crash),即闪退,多指在移动设备(如:iOS、Android设备)中,在打开应用程序时出现的突然退出中断的情况。 如果App应用的线上版本发生过多的崩溃,会影响用户体验,导致用户流失,以及可能减少收益。 诸葛io的「App崩溃分析」功能,可以帮助产品、运营人员对App应用发生崩溃的次数、影响的人数进行监测,也可以查看崩溃路径,还原崩溃场景,了解用户是如何一步一步发生的崩溃。同时,可以协助

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 问题内容: 我的JVM一直在libzip.so上持续崩溃,并且出乎意料。我已经将该错误提交给了Oracle,但决定看看这里是否有人遇到过该问题,如果是,您如何处理它?这是一个正在运行的网络应用 Linux 2.6.34-gentoo-r6#1 SMP Fri Sep 24 00:15:06 EDT 2010 i686 Intel(R)Xeon(R)CPU X5460 @ 3.16GHz 真正的带j