繁体   English   中英

Java Android 使用 NetworkCallBack 检查 Internet 连接

[英]Java Android Check Internet Connection with NetworkCallBack

我正在尝试使用 NetworkCallBack 检查互联网连接。 但是,我的代码返回奇怪的结果。 请协助。 任何帮助将不胜感激。

CheckNetwork.java

    import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkRequest;
import android.os.Build;
import android.util.Log;

import androidx.annotation.RequiresApi;

public class CheckNetwork {

    private Context context;
    
    public CheckNetwork(Context context) {
        this.context = context;
    }
    
    @RequiresApi(api = Build.VERSION_CODES.N)
    public void registerNetworkCallback()
    {
        try {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkRequest.Builder builder = new NetworkRequest.Builder();

            connectivityManager.registerDefaultNetworkCallback( new ConnectivityManager.NetworkCallback(){
                                                                   @Override
                                                                   public void onAvailable(Network network) {
                                                                       Log.d("available", "internet");
                                                                       Variables.isNetworkConnected = true;
                                                                       Log.d("Net_Var_In", String.valueOf(Variables.isNetworkConnected));
                                                                   }
                                                                   @Override
                                                                   public void onLost(Network network) {
                                                                       Log.d("not_av", "internet");
                                                                       Variables.isNetworkConnected = false;
                                                                   }
                                                               }

            );
        }catch (Exception e){
            e.printStackTrace();
            Variables.isNetworkConnected = false;
        }

        Log.d("Net_Var_End", String.valueOf(Variables.isNetworkConnected));

    }
}

MainActivity.java

CheckNetwork checkNetwork = new CheckNetwork(getApplicationContext());
    checkNetwork.registerNetworkCallback();
    Log.d("Net_Var_Main", String.valueOf(Variables.isNetworkConnected));

    if(Variables.isNetworkConnected)
    {
        Log.d("Internet", "available");
    }
    else
    {
        setContentView(R.layout.activity_internet);
        return false;
    }

日志猫:

当互联网连接/可用时:(即使它打印互联网可用,它仍然会转到 layout_internet ..这是互联网不可用时的布局)

    2020-07-17 14:07:09.735 3671-3671/com.example.scrollingtext D/Net_Var_End: false
2020-07-17 14:07:09.735 3671-3671/com.example.scrollingtext D/Net_Var_Main: false
2020-07-17 14:07:09.794 3671-3671/com.example.scrollingtext W/e.scrollingtex: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2020-07-17 14:07:09.795 3671-3671/com.example.scrollingtext W/e.scrollingtex: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2020-07-17 14:07:09.816 3671-3702/com.example.scrollingtext D/available: internet
2020-07-17 14:07:09.816 3671-3702/com.example.scrollingtext D/Net_Var_In: true

当互联网未连接/不可用时:(即使它打印互联网可用,它仍然会转到 layout_internet ..这是互联网不可用时的布局)

    2020-07-17 14:09:31.611 3744-3744/com.example.scrollingtext D/Net_Var_End: false
2020-07-17 14:09:31.611 3744-3744/com.example.scrollingtext D/Net_Var_Main: false
2020-07-17 14:09:31.663 3744-3744/com.example.scrollingtext W/e.scrollingtex: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
2020-07-17 14:09:31.663 3744-3744/com.example.scrollingtext W/e.scrollingtex: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
2020-07-17 14:09:31.678 3744-3776/com.example.scrollingtext D/available: internet
2020-07-17 14:09:31.678 3744-3776/com.example.scrollingtext D/Net_Var_In: true

编辑

基于 CheckNetwork.java,它使用 NetworkCallBack 监控网络的 state ..你如何 go 关于更改布局和可用用户屏幕前的 Onvailable 时() 我想在运行 OnLost() 时打开 layout_internet ...然后在运行 OnAvailable 时打开 layout_activity_main。 这需要在 CheckNetwork 内部进行。 因此,似乎我正在寻找从 OnAvailable 或 OnLost 访问 setContentView(仅在 MainActivity 中可用)的权限。 或者当互联网可用/丢失时,我可以打开 layout_internet 和 layout_activity_main 吗?

正确的!!

if(Variables.isNetworkConnected)
    {
        Log.d("Internet", "available");
    }
    else
    {
//        -------> load net not available layout here
        setContentView(R.layout.activity_internet);
        return false;
    }

您可以查看此代码: https://github.com/vladan29/internet_monitor这是一个工作代码,可以不断地通知订阅的类有关网络的变化。 您可以使用标准 android 接收器代替 EventBus,但不推荐使用粘性意图,并且您将在启动 state 时遇到问题。 如果您克隆此应用程序,您可以按照连接 state 和手机屏幕上的其他一些值。

我必须添加一些解释。 您不能简单地使用 onLost() 来检测何时没有互联网连接。 仅当您在该地区有一个互联网时,这才有正确的工作。 如果您有 WIFI 和 CELLULAR 可用,则当一个信号开始丢失时,另一个触发 onAvailable(),但稍后会触发 onLost()。 那时你已经有一个活动的连接并且 isConnected 应该是真的。

现在,您可以使用链接中的库: https://github.com/vladan29/internet_checker/blob/master/README.md#internet_checker

私有 ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {

@Override
public void onAvailable(@NonNull Network network) {
    super.onAvailable(network);
}

@Override
public void onLost(@NonNull Network network) {
    super.onLost(network);
}

@Override
public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
    super.onCapabilitiesChanged(network, networkCapabilities);
    final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
}

};

ConnectivityManager#registerDefaultNetworkCallback将返回设备的默认网络(或 Android 12+ 的应用程序本身)。 现在,默认网络并不总是具有完整的 Internet 连接。

我不会对 go 深入探讨 Android 如何设置默认网络,但要解决您的问题,请将您的调用更改为registerDefaultNetworkCallback以使用registerNetworkCallbackNetworkRequest ,其中包括VALIDATED功能,如下所示:

NetworkRequest nr = 
    new NetworkRequest.Builder()
    .addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
    .build();

connectivityManager.registerNetworkCallback(
    nr, 
    new ConnectivityManager.NetworkCallback(){
        //REST OF YOUR CODE YOU ALREADY HAVE HERE

这是有效的,因为现在您只会收到有关已VALIDATED链接)的网络的通知,而不是可能VALIDATED验证的默认网络。

NET_CAPABILITY_VALIDATED

表示此网络上的连接已成功验证。 例如,对于具有 NET_CAPABILITY_INTERNET 的网络,这意味着已成功检测到 Internet 连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM