已经初始化的对象在 BroadcastListener 方法中设置为 null:onReceive
Already initialised object is set to null in BroadcastListener Method: onReceive
我的 Class NetworkListener 应该检查 Internet 连接是否可用。然后,它应该显示带有 InternetState 的 Snackbar。为此,我使用了一个界面。
我的全部代码:
[MainActivity.java]:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle(R.string.Inbox);
Initialize_NavigationDrawer();
Initialize_Objects();
//1. Here, I initialise my NetworkListener and register my Receiver
NetworkListener mNetworkListener = new NetworkListener();
mNetworkListener.registerReceiver(this);
}
@Override
public void ToggleSnackbar(boolean ShowHide) {
if (ShowHide) snbNoInternet.show();
else snbNoInternet.dismiss();
}
[NetworkListener.java]:
public class NetworkListener extends BroadcastReceiver {
private SnackbarInterface snbInterface;
public NetworkListener() {}
@Override
public void onReceive(Context context, Intent intent) {
//4. After toggling the Network-Connection, a NullReferenceException occurs
//5. System.out.println(snbInterface) shows: null
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null || !ni.isConnected()) {
snbInterface.ToggleSnackbar(true);
}
else if (ni != null && ni.isConnected()) {
snbInterface.ToggleSnackbar(false);
}
}
public void registerReceiver(SnackbarInterface receiver) {
snbInterface = receiver; //2. Is called from onCreate
//3. System.out.println(snbInterface) shows: at.guger.email.activities.MainActivity@27472a5e
}
public interface SnackbarInterface {
public void ToggleSnackbar(boolean ShowHide);
}
}
[AndroidManifest.xml]:
<activity
android:name=".activities.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activities.WriteActivity" />
<activity
android:name=".activities.ReadActivity" />
<receiver
android:name=".NetworkListener">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
以及权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
调用代码就像数字一样!
我真的无法解释,为什么snbInterface设置为null!
希望你能帮帮我!
您使用 AndroidManifest 中的 receiver
元素注册了 BroadcastReceiver
。 Android 系统创建 BroadcastReceiver 实例并使用适当的参数调用 onReceive
方法。
如果你想使用 BroadcastReceiver
来操作你的应用程序的 UI (比如 show/hide Snackbar
),你必须在你的 activity 使用 onCreate
方法中的 registerReceiver(BroadcastReceiver receiver,IntentFilter intentFilter)
和 onDestroy
方法中的 unRegister
activity.
从 AndroidManifest.xml 文件中删除 receiver
元素并通过代码创建 BroadcastReceiver。
这里的这个问题对如何创建和注册 BroadcastReceivers 有一个清晰的解释:
Broadcast Receiver class and registerReceiver method
在 BroadcastReceiver 的 onReceive 方法中,调用 Activity 中的 toggleSnackbar
方法来切换 Snackbar。
还有另一种方法可以实现您想要的效果。在这里讨论:
Inform Activity from a BroadcastReceiver ONLY if it is in the foreground
阅读更多关于 BroadcastReceivers 的内容 here
您可以将 Receiver 写成一个单独的 class。实例化 Receiver 并调用 registerReceiver
,第一个参数作为 Receiver,第二个参数作为 IntentFilter。
我的 Class NetworkListener 应该检查 Internet 连接是否可用。然后,它应该显示带有 InternetState 的 Snackbar。为此,我使用了一个界面。
我的全部代码:
[MainActivity.java]:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle(R.string.Inbox);
Initialize_NavigationDrawer();
Initialize_Objects();
//1. Here, I initialise my NetworkListener and register my Receiver
NetworkListener mNetworkListener = new NetworkListener();
mNetworkListener.registerReceiver(this);
}
@Override
public void ToggleSnackbar(boolean ShowHide) {
if (ShowHide) snbNoInternet.show();
else snbNoInternet.dismiss();
}
[NetworkListener.java]:
public class NetworkListener extends BroadcastReceiver {
private SnackbarInterface snbInterface;
public NetworkListener() {}
@Override
public void onReceive(Context context, Intent intent) {
//4. After toggling the Network-Connection, a NullReferenceException occurs
//5. System.out.println(snbInterface) shows: null
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null || !ni.isConnected()) {
snbInterface.ToggleSnackbar(true);
}
else if (ni != null && ni.isConnected()) {
snbInterface.ToggleSnackbar(false);
}
}
public void registerReceiver(SnackbarInterface receiver) {
snbInterface = receiver; //2. Is called from onCreate
//3. System.out.println(snbInterface) shows: at.guger.email.activities.MainActivity@27472a5e
}
public interface SnackbarInterface {
public void ToggleSnackbar(boolean ShowHide);
}
}
[AndroidManifest.xml]:
<activity
android:name=".activities.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activities.WriteActivity" />
<activity
android:name=".activities.ReadActivity" />
<receiver
android:name=".NetworkListener">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
以及权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
调用代码就像数字一样! 我真的无法解释,为什么snbInterface设置为null!
希望你能帮帮我!
您使用 AndroidManifest 中的 receiver
元素注册了 BroadcastReceiver
。 Android 系统创建 BroadcastReceiver 实例并使用适当的参数调用 onReceive
方法。
如果你想使用 BroadcastReceiver
来操作你的应用程序的 UI (比如 show/hide Snackbar
),你必须在你的 activity 使用 onCreate
方法中的 registerReceiver(BroadcastReceiver receiver,IntentFilter intentFilter)
和 onDestroy
方法中的 unRegister
activity.
从 AndroidManifest.xml 文件中删除 receiver
元素并通过代码创建 BroadcastReceiver。
这里的这个问题对如何创建和注册 BroadcastReceivers 有一个清晰的解释: Broadcast Receiver class and registerReceiver method
在 BroadcastReceiver 的 onReceive 方法中,调用 Activity 中的 toggleSnackbar
方法来切换 Snackbar。
还有另一种方法可以实现您想要的效果。在这里讨论: Inform Activity from a BroadcastReceiver ONLY if it is in the foreground
阅读更多关于 BroadcastReceivers 的内容 here
您可以将 Receiver 写成一个单独的 class。实例化 Receiver 并调用 registerReceiver
,第一个参数作为 Receiver,第二个参数作为 IntentFilter。