簡體   English   中英

網絡回調onAvailable方法中接口null指針異常

[英]Interface null pointer exception in Network Callback onAvailable method

下面是我的代碼,我試圖實現接口來攔截來自連接管理器網絡回調的響應,但是 Android Studio 在 onAvailable 方法中的這個接口 internetListener.onInternetStatusUpdate(true) 處拋出錯誤。

我還在我的主要活動中實現了這個接口。 我也遵循了一些例子,但失敗了。 是不是那個onAvailable方法,我的接口不可達?

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

堆棧跟蹤

2019-09-25 10:08:02.566 29555-29578/com.kioskactionandnotification E/AndroidRuntime: FATAL EXCEPTION: ConnectivityThread
    Process: com.kioskactionandnotification, PID: 29555
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.kioskactionandnotification.Model.Helper.CheckInternetAsyncTask$InternetListener.onInternetStatusUpdate(boolean)' on a null object reference
        at com.kioskactionandnotification.Model.Helper.CheckInternetAsyncTask.onAvailable(CheckInternetAsyncTask.java:85)
        at android.net.ConnectivityManager$NetworkCallback.onAvailable(ConnectivityManager.java:2770)
        at android.net.ConnectivityManager$CallbackHandler.handleMessage(ConnectivityManager.java:2969)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.os.HandlerThread.run(HandlerThread.java:65)

MainActivity.java

我實現了接口

@Override
    public void onInternetStatusUpdate(boolean hasInternet) {
        this.hasInternet = hasInternet;
        Log.d(TAG, "onInternetStatusUpdate: hasInternet : "+hasInternet);
    }

那是我的全部了。

您似乎正在嘗試訪問類型為internetListener的未初始化 object 。

你需要初始化它:

internetListener = new InternetListener();

或者檢查它是否已經初始化:

if (internetListener != null) {
 internetListener.onInternetStatusUpdate(true);
}

筆記

您正在使用的任何抽象 class 都應該由一個子類擴展,該子類為抽象 class 中使用的任何抽象數據/方法提供實現。

摘要 class 在 Java

在下面的構造函數中,我添加了一個偵聽器。 它基本上是我的界面。

public CheckInternetAsyncTask(Context _context, InternetListener internetListener) {
    this.context = _context;
    this.internetListener = internetListener;

}

然后在我實現這個接口的主要活動中,我不得不將“this”關鍵字推送給我的聽眾。 我仍在研究上下文和“this”關鍵字之間的區別以及它們在接口上的工作方式

new CheckInternetAsyncTask(context, this);

參考: 如何在android中創建自己的Listener接口?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM