Java 网络回调onAvailable方法中的接口空指针异常

Java 网络回调onAvailable方法中的接口空指针异常,java,android,Java,Android,下面是我的代码,我试图实现接口来拦截来自Connectivity Manager网络回调的响应,但Android Studio在onAvailable方法中的internetListener.onInternetStatusUpdate(true)接口处抛出错误 我还在我的主要活动中实现了这个接口。我也举了几个例子,但失败了。是不是因为一个可用的方法,我的接口无法访问 public class CheckInternetAsyncTask extends ConnectivityManager.

下面是我的代码,我试图实现接口来拦截来自Connectivity Manager网络回调的响应,但Android Studio在onAvailable方法中的internetListener.onInternetStatusUpdate(true)接口处抛出错误

我还在我的主要活动中实现了这个接口。我也举了几个例子,但失败了。是不是因为一个可用的方法,我的接口无法访问

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);