我正在尝试检查与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..which是当互联网不可用时的布局)
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是当互联网不可用时的布局)
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吗?
发布于 2020-07-22 22:04:59
您可以查看此代码:监控器 --这是一个工作代码,它不断地通知订阅的类有关网络更改的信息。您可以使用标准的android接收器而不是EventBus,但粘性意图是不可取的,并且您将遇到启动状态的问题。如果你克隆这个应用程序,你可以在手机屏幕上跟踪连接状态和其他一些值。
我必须补充一些解释。您不能简单地使用onLost()来检测没有internet连接的情况。这有正确的工作,只有当你有一个互联网在该地区。如果您有WIFI和蜂窝,当一个人开始失去信号,另一个触发onAvailable(),但onLost()会被触发。此时,您已经有了一个活动的连接,isConnected应该是真的。
现在,您可以在链接:检验员上使用一个库
发布于 2020-07-17 12:16:25
正确!!
if(Variables.isNetworkConnected)
{
Log.d("Internet", "available");
}
else
{
// -------> load net not available layout here
setContentView(R.layout.activity_internet);
return false;
}
发布于 2022-07-22 20:50:01
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);
}
};
https://stackoverflow.com/questions/62953726
复制相似问题