首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在BroadcastListener方法: onReceive中,已经初始化的对象设置为null

在BroadcastListener方法: onReceive中,已经初始化的对象设置为null
EN

Stack Overflow用户
提问于 2016-02-28 18:16:38
回答 1查看 607关注 0票数 1

我的类NetworkListener应该检查,是否有互联网连接可用。然后,它应该显示带有InternetState的Snackbar。为此,我使用了一个接口。

我的全部代码:

MainActivity.java

代码语言:javascript
复制
@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

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>

以及权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

代码被调用,就像数字被排序一样!我真的无法解释,为什么snbInterface设置为null!

我希望你能帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-28 19:15:43

您使用BroadcastReceiver中的receiver元素注册了AndroidManifest。Android创建BroadcastReceiver实例并使用适当的参数调用onReceive方法。

如果要使用BroadcastReceiver来操作应用程序的UI (如显示/隐藏Snackbar ),则必须在活动中使用onCreate方法中的registerReceiver(BroadcastReceiver receiver,IntentFilter intentFilter)和活动的onDestroy方法中的unRegister注册接收方。

receiver文件中删除AndroidManifest.xml元素,并通过代码创建BroadcastReceiver。

这里的问题清楚地解释了如何创建和注册BroadcastReceivers:广播接收类与registerReceiver方法

在onReceive方法的BroadcastReceiver中,调用活动中的toggleSnackbar方法来切换Snackbar。

还有另一种方法来实现你想要的。这里讨论的是:只有当BroadcastReceiver位于前台时才通知活动

阅读关于BroadcastReceivers 这里的更多信息

您可以将接收方写成一个单独的类。实例化接收器并调用registerReceiver,第一个参数作为接收方,第二个参数作为IntentFilter。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35686374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档