Java 网络回调onAvailable方法中的接口空指针异常
下面是我的代码,我试图实现接口来拦截来自Connectivity Manager网络回调的响应,但Android Studio在onAvailable方法中的internetListener.onInternetStatusUpdate(true)接口处抛出错误 我还在我的主要活动中实现了这个接口。我也举了几个例子,但失败了。是不是因为一个可用的方法,我的接口无法访问Java 网络回调onAvailable方法中的接口空指针异常,java,android,Java,Android,下面是我的代码,我试图实现接口来拦截来自Connectivity Manager网络回调的响应,但Android Studio在onAvailable方法中的internetListener.onInternetStatusUpdate(true)接口处抛出错误 我还在我的主要活动中实现了这个接口。我也举了几个例子,但失败了。是不是因为一个可用的方法,我的接口无法访问 public class CheckInternetAsyncTask extends ConnectivityManager.
public class CheckInternetAsyncTask extends ConnectivityManager.NetworkCallback
{
private static final String TAG = "CheckInternetAsyncTask";
private Context context;
public InternetListener internetListener;
private ConnectivityManager connectivityManager;
private Network network;
private NetworkCapabilities networkCapabilities;
public interface InternetListener{
void onInternetStatusUpdate(boolean hasInternet);
}
public CheckInternetAsyncTask(Context _context) {
this.context = _context;
this.connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(this);
}
try {
new SendInternetRequest().execute().get(5, TimeUnit.SECONDS);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
public void TestInternetRequest(){
try {
new SendInternetRequest().execute().get(5, TimeUnit.SECONDS);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
this.network = network;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(network);
this.network = connectivityManager.getActiveNetwork();
}else{
ConnectivityManager.setProcessDefaultNetwork(network);
}
this.networkCapabilities = connectivityManager.getNetworkCapabilities(network);
if(networkCapabilities != null && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)){
internetListener.onInternetStatusUpdate(true);
}else{
try {
new SendInternetRequest().execute().get(5, TimeUnit.SECONDS);
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
}
class SendInternetRequest extends AsyncTask<Void,Void, Void>{
private static final String TAG = "SendInternetRequest";
CheckInternetAsyncTask.InternetListener internetListener;
@Override
protected Void doInBackground(Void... voids) {
try {
Socket sock = new Socket();
sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500);
sock.close();
internetListener.onInternetStatusUpdate(true);
} catch (IOException e) {
internetListener.onInternetStatusUpdate(false);
}
return null;
}
}
MainActivity.java
我实现了这个接口
@Override
public void onInternetStatusUpdate(boolean hasInternet) {
this.hasInternet = hasInternet;
Log.d(TAG, "onInternetStatusUpdate: hasInternet : "+hasInternet);
}
我只有这些了 您似乎试图访问类型为
internetListener
的未初始化对象
您需要初始化它:
或者检查它是否已初始化:
注
您正在使用的任何抽象类都应该由一个子类扩展,该子类为抽象类中使用的任何抽象数据/方法提供实现
在下面的构造函数中,我添加了一个侦听器。基本上是我的界面
public CheckInternetAsyncTask(Context _context, InternetListener internetListener) {
this.context = _context;
this.internetListener = internetListener;
}
然后在我实现这个接口的主要活动中,我必须将“this”关键字推送到我的侦听器。
我仍在研究上下文和“this”关键字之间的区别,以及它们在接口上的工作方式
new CheckInternetAsyncTask(context, this);
引用:您返回的是一个void函数?@BAS您的意思是在异步任务上,您在后台做什么?实际上,编译器正在抱怨缺少返回语句。所以我只返回null。因为它是一片空白。但错误并不存在。它以一种可用的方法发生。internetListener.onInternetStatusUpdate(true);返回
null
表示您正在返回某些内容。您应该不返回任何内容return代码>试试看是否有什么不同。@BAS否,编译器仍然抛出缺少的返回语句。但是现在我正在试图解决为什么我的接口不可访问?哦,我明白了,函数有一个返回类型Void
,大写V
,它不是Void
关键字。InternetListener是一个接口。它无法初始化。我得到错误InternetListener是抽象的。不可能intantiated@KIRPALSINGH我的问题是类中有接口,而不是抽象类。我也不是在扩展抽象类。因此,我不太确定这里发生了什么。从何处导入InternetListener
。公共接口InternetListener{void onInternetStatusUpdate(布尔hasInternet);}这正是我所说的<代码>“您需要初始化它!”
if (internetListener != null) {
internetListener.onInternetStatusUpdate(true);
}
public CheckInternetAsyncTask(Context _context, InternetListener internetListener) {
this.context = _context;
this.internetListener = internetListener;
}
new CheckInternetAsyncTask(context, this);