【问题标题】:How to prevent click on a url when no internet connection - android studio没有互联网连接时如何防止点击网址 - android studio
【发布时间】:2020-01-28 11:47:27
【问题描述】:

我使用 Android Studio 在 android 应用程序中转换我的网站。 当打开时没有互联网连接时,我尝试显示对话框。它工作正常。

但问题是当应用程序仍在运行时突然没有互联网连接。然后,如果我点击一个 url,webview 会显示“网页不可用”。

MainActivity.java

package com.example.myapp;

import android.graphics.Bitmap;
import android.provider.SyncStateContract;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private WebView mywebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (!DetectConnection.checkInternetConnection(this)) {
            try {
                AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();

                alertDialog.setTitle("Info");
                alertDialog.setMessage("Internet non disponible, Verifiez votre connexion internet et réessayez");
                alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
                alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Réessayer", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                        startActivity(getIntent());
                    }
                });

                alertDialog.show();
            } catch (Exception e) {

            }
        } else {
            mywebView = (WebView) findViewById(R.id.webview);
            WebSettings webSettings = mywebView.getSettings();
            mywebView.loadUrl("https://myapp.com/");
            mywebView.setWebViewClient(new WebViewClient());
            mywebView.clearCache(true);
            mywebView.clearHistory();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        }
    }

    public class myWebClient extends WebViewClient{
        @Override
        public void onPageStarted (WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
           view.loadUrl(url);
           return true;
        }
    }

    @Override
    public void onBackPressed (){
        if(mywebView.canGoBack()){
            mywebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

DetectConnection.java

package com.example.mycollege;

import android.content.Context;
import android.net.ConnectivityManager;


public class DetectConnection {
    public static boolean checkInternetConnection(MainActivity context) {

        ConnectivityManager con_manager = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);

        return (con_manager.getActiveNetworkInfo() != null
                && con_manager.getActiveNetworkInfo().isAvailable()
                && con_manager.getActiveNetworkInfo().isConnected());
    }
}

我想知道如何防止在未检测到连接时单击将默认页面“网页不可用”替换为对话框“没有互联网,请检查您的连接!”。 有什么想法吗?

【问题讨论】:

    标签: android android-studio webview


    【解决方案1】:

    您的 myWebClient 类将类似于:

    // Function to load all URLs in same webview
    private class myWebClient extends WebViewClient {
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (!DetectConnection.checkInternetConnection(this)) {
          Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show();
        } else {
          view.loadUrl(url);
        }     
        return true;
      }
    }
    

    检查shouldOverrideUrlLoading内的互联网连接。

    谢谢。

    【讨论】:

    • 我更改了 @Pratik Butani 先生,但它显示此消息 “错误:不兼容的类型:MainActivity.myWebClient 无法转换为 MainActivity”。错误指的是 !DetectConnection.checkInternetConnection(this) 中的 "this"。有什么想法吗?
    • this更改为MainActivity.this
    • 我认为你应该学习一些有助于解决这类基本问题的基本概念。
    • 我将 this 更改为 MainActivity.this 并且没有错误。但这并不能解决问题。
    【解决方案2】:

    第一:

    在按钮的 onClick 方法中,首先检查互联网是否可用

    在您的活动中添加此方法:

      public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager objConnectivityManager;
        try {
            objConnectivityManager = (ConnectivityManager) context.getSystemService(Activity.CONNECTIVITY_SERVICE);
            final boolean IsWifiAvailable = objConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected();
    
            boolean IsInternetAvailable = false;
            if (objConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null)
                IsInternetAvailable = objConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected();
            if (IsWifiAvailable == true || IsInternetAvailable == true)
                return true;
            else
                return false;
        } catch (Exception e) {
            return false;
        }
    }
    

    然后在你的 onClick 中调用这个方法

    boolean isNetworkAvailable = CommonMethods.isNetworkAvailable(this);
            if (isNetworkAvailable){
                // Call the webpage
            }else {
                Toast.makeText(this, "No internet connection", Toast.LENGTH_SHORT).show();
            }
    

    第二: 如果你问的是——

    1. 您正在使用应用程序

    2. 互联网连接已开启

    3. 但是服务器没有响应[没有互联网]

    然后在您的网络视图上使用超时参考this answer

    【讨论】:

    • 那么 @Makarand 先生,您如何称呼 CommonMethods
    • @MohamedFall CommonMethod 是一个单独的类。为项目需要的常用方法而创建。只需在其中复制并粘贴 isNetworkAvailable 方法,即可在任何地方调用它。
    【解决方案3】:

    点击时间检查这两种方法,如果网络可用则继续操作

    1 - 检查连接:

    private boolean isNetworkConnected() {
            ConnectivityManager cm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
            return cm.getActiveNetworkInfo() != null;
        }
    

    2 - 检查互联网:

    public boolean internetIsConnected() {
            try {
                String command = "ping -c 1 google.com";
                return (Runtime.getRuntime().exec(command).waitFor() == 0);
            } catch (Exception e) {
                return false;
            }
        }
    

    向清单添加权限:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      相关资源
      最近更新 更多