首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java用NetworkCallBack检查互联网连接

Java用NetworkCallBack检查互联网连接
EN

Stack Overflow用户
提问于 2020-07-17 12:13:12
回答 4查看 4.6K关注 0票数 1

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

CheckNetwork.java

代码语言:javascript
运行
复制
    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

代码语言:javascript
运行
复制
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..which是当互联网不可用时的布局)

代码语言:javascript
运行
复制
    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

当internet没有连接/可用时,:(即使它打印出互联网是可用的,它还是会转到layout_internet..which是当互联网不可用时的布局)

代码语言:javascript
运行
复制
    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..how监视网络状态),您会在运行OnAvailable()和OnLost()时在用户屏幕前更改布局吗?我想在OnLost()是run...and时打开layout_activity_main,在运行OnAvailable时打开layout_activity_main。这需要在CheckNetwork内部实现。因此,我似乎在寻找从setContentView或OnLost访问OnAvailable (只在MainActivity中可用)的方法。或者,当互联网可用/丢失时,我还有其他方法可以打开layout_internet和layout_activity_main吗?

EN

回答 4

Stack Overflow用户

发布于 2020-07-22 22:04:59

您可以查看此代码:监控器 --这是一个工作代码,它不断地通知订阅的类有关网络更改的信息。您可以使用标准的android接收器而不是EventBus,但粘性意图是不可取的,并且您将遇到启动状态的问题。如果你克隆这个应用程序,你可以在手机屏幕上跟踪连接状态和其他一些值。

我必须补充一些解释。您不能简单地使用onLost()来检测没有internet连接的情况。这有正确的工作,只有当你有一个互联网在该地区。如果您有WIFI和蜂窝,当一个人开始失去信号,另一个触发onAvailable(),但onLost()会被触发。此时,您已经有了一个活动的连接,isConnected应该是真的。

现在,您可以在链接:检验员上使用一个库

票数 1
EN

Stack Overflow用户

发布于 2020-07-17 12:16:25

正确!!

代码语言:javascript
运行
复制
if(Variables.isNetworkConnected)
    {
        Log.d("Internet", "available");
    }
    else
    {
//        -------> load net not available layout here
        setContentView(R.layout.activity_internet);
        return false;
    }
票数 0
EN

Stack Overflow用户

发布于 2022-07-22 20:50:01

代码语言:javascript
运行
复制
private 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);
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62953726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档