gpt4 book ai didi

android - 在广播接收器中添加自定义监听器会在 Android 中产生 NPE

转载 作者:行者123 更新时间:2023-11-29 19:57:00 24 4
gpt4 key购买 nike

我在这里遇到了一个问题。我正在尝试通过实现广播接收器来收听连接变化。此外,我还在广播接收器中初始化了一个自定义监听器,以便与有关要显示的连接变化的 Activity 进行通信一个面包丁 toast 。各个类的代码如下:

广播接收器:

public class NetworkStateReceiver extends BroadcastReceiver {

private NetworkStateListener networkStateListener;

public NetworkStateReceiver() {
}

public NetworkStateReceiver(NetworkStateListener networkStateListener) {
this.networkStateListener = networkStateListener;
}

@Override
public void onReceive(Context context, Intent intent) {
Log.d("test", "Network connectivity change ::: " + this.networkStateListener);
if (intent.getExtras() != null) {

NetworkInfo ni = (NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
Log.i("test", "Network " + ni.getTypeName() + " connected");
networkStateListener.onConnected();
}
}
if (intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
Log.d("test", "There's no network connectivity");
networkStateListener.onDisconnected();
}
}
}

自定义监听器接口(interface):

public interface NetworkStateListener {

public void onConnected();

public void onDisconnected();
}

实现监听器并为连接更改注册接收器的 Activity :

    public class HomeActivity extends AppCompatActivity implements NetworkStateListener {
private NetworkStateReceiver mReceiver;
private LocalBroadcastManager mBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mBroadcastManager = LocalBroadcastManager.getInstance(HomeActivity.this);
mReceiver = new NetworkStateReceiver(HomeActivity.this);
}

@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION);
mBroadcastManager.registerReceiver(mReceiver, intentFilter);
}

@Override
protected void onPause() {
super.onPause();
mBroadcastManager.unregisterReceiver(mReceiver);
}
}

这是 list 条目:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<application
android:name=".TestApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"

<receiver android:name=".shared.receivers.NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
</application>

</manifest>

我不知道为什么 networkstateListener 没有被初始化。它给出了一个空指针,表示 NetWorkStateListener 可能没有被初始化。有人可以帮我解决这个问题吗?我过去曾实现过这一点,但使用的是自定义广播,而不是此类系统广播。

最佳答案

CONNECTIVITY_CHANGE广播由系统发送。这对您当前的设置意味着一些事情。

  1. 您的 BroadcastReceiver 的实例你正在注册 LocalBroadcastManager将永远不会收到该广播,因为 LocalBroadcastManager仅处理源自您的应用内的广播。

  2. 在 list 中注册您的 Receiver 类意味着系统将实例化一个新的 Receiver 实例来处理每个广播。由于这些实例不会传递给您的 Activity 的实例作为听众,networkStateListeneronReceive() 中将为空,这很可能是您当前的 NullPointerException来自。

根据您想要的行为,您有几个选项可供选择。

如果您只想在 Activity 时收到连接更改通知正在运行:

  1. Context#registerReceiver() 注册一个 Receiver 实例方法,并删除 <receiver>从 list 中输入。如果你做 NetworkStateReceiver HomeActivity 的内部类,您将不需要界面。

  2. 使用 LocalBroadcastManager NetworkStateReceiver之间进行沟通和你的 Activity ,而不是你的听众 interface .您可以在 Intent 上使用额外的指示连接状态,或者使用不同的操作来区分。

  3. 使用其他一些事件总线实现在接收器和 Activity 之间进行通信.

如果您希望即使在您的应用未运行时也能收到更改通知:

  1. 开始你的Activity来自接收器,附加到 Intent指示连接状态。这也可以处理您的 Activity 的情况。已经运行,如果你设置 ActivitylaunchModesingleTasksingleTop ,并覆盖它的 onNewIntent()方法。

无论如何,传递你的 Activity作为您的 BroadcastReceiver 的倾听者确实没有必要。

关于android - 在广播接收器中添加自定义监听器会在 Android 中产生 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36653031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com