【问题标题】:Java Android Check Internet Connection with NetworkCallBackJava Android 使用 NetworkCallBack 检查 Internet 连接
【发布时间】:2020-11-07 05:53:30
【问题描述】:

我正在尝试使用 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;
    }

Logcat:

当互联网连接/可用时:(即使它打印互联网可用,它仍然会转到 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 监控网络状态。当 OnAvailable() 和 OnLost() 运行时,您将如何更改用户屏幕前的布局?我想在运行 OnLost() 时打开 layout_internet ...然后在运行 OnAvailable 时打开 layout_activity_main。这需要在 CheckNetwork 内部进行。因此,似乎我正在寻找从 OnAvailable 或 OnLost 访问 setContentView(仅在 MainActivity 中可用)的权限。还是有其他方法可以在互联网可用/丢失时打开 layout_internet 和 layout_activity_main?

【问题讨论】:

  • 您注册了一个新的默认 NetworkCallback,它会关闭并在另一个线程中执行一些工作。同时,isNetworkConnected 的值被记录两次:Net_Var_End 和 Net_Var_Main。您的主电源关闭并为您显示。稍后 NetworkCallback 最终到达 onAvailable 调用并将 isNetworkConnected 更改为 true。
  • 谢谢。但是为什么在没有网络连接的情况下会去onAvailable呢?
  • 您确定没有可用的网络,而不仅仅是没有可用的互联网吗?本地 WiFi 是否关闭和/或内部网络设备是否处于非活动状态或您的 DSL 连接是否关闭?
  • 互联网不可用。我手动断开了WIFI,没有移动网络。这就是我正在测试的情况。很抱歉提供错误信息。
  • 看起来蜂窝网络也算作网络,所以只关闭 WiFi 并不会计入带有 Simcard 的设备。 stackoverflow.com/questions/53863034/… 也不要忘记在你的回调中调用 Super:super.onAvailable(network);

标签: java android callback internet-connection network-connection


【解决方案1】:

正确!!

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

【讨论】:

  • 在这里原谅我的愚蠢......请解释一下。当没有互联网连接时,它会恢复到 layout.activity_internet。即使有互联网连接,它也会恢复到相同的布局。为什么?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多