【发布时间】: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