首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android可观测模式和2个可观测数据

Android可观测模式和2个可观测数据
EN

Stack Overflow用户
提问于 2015-07-11 11:54:17
回答 1查看 844关注 0票数 1

在我的活动中,我有一个我初始化为这样的广播接收器:

代码语言:javascript
复制
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateViews();
    }
};

updateViews()是仅在广播接收器中使用的活动中的函数。我如何创建这个接收器作为一个单独的类,可以玩视图(旋转,删除等)。我的活动?

此外,我在活动中有一个指南针。它可以工作,但我也想让罗盘成为一个单独的类,可以发送数据到活动。它不会更改活动的视图,而是只更新某些double/float值。

代码语言:javascript
复制
@Override
public void onSensorChanged(SensorEvent event) {    }

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {    }
EN

回答 1

Stack Overflow用户

发布于 2015-07-11 17:58:10

我如何创建这个接收器作为一个单独的类.?

这个答案假设“单独的类”意味着您希望在它自己的源文件中定义一个BroadcastReceiver,而不是一个活动的内部类。在提出解决方案之前,我会问,你希望这样做能得到什么好处?您是否有多个将使用接收器的活动?如果没有,最好将其保留为使用它的单个活动的内部类。如果不喜欢在发布的代码中使用匿名内部类,则可以声明为内部类:

代码语言:javascript
复制
private class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // As an inner class of the activity, this receiver has
        // access to all activity members.
        updateViews();
    }
}

如果您真的希望它成为一个独立的接收方,下面的示例代码就是一个起点。确保在活动的onResume/onPause回调中注册/注销接收方。该示例包括使用普通活动引用的不太安全的方法的代码,以及使用弱引用的安全方法。只需要一个。

代码语言:javascript
复制
public class MyBroadcastReceiver extends BroadcastReceiver {
    // For less safe use
    private MyClientActivity mActivity;
    // For more safe use
    private WeakReference<MyClientActivity> mActivityRef;

    public MyBroadcastReceiver(MyClientActivity activity) {
        mActivity = activity;
        mActivityRef = new WeakReference<MyClientActivity>(activity);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // Less safe
        mActivity.findViewById(R.id.action_bar);
        mActivity.someActivityMemberMethod();
        // etc

        // More safe.  Guards against failure to unregister
        // this receiver when activity is paused.
        MyClientActivity act = mActivityRef.get();
        if (act != null && !act.isDestroyed()) {
            mActivity.findViewById(R.id.action_bar);
            mActivity.someActivityMemberMethod();
            // etc
        } else {
            // Error: Activity failed to unregister this receiver
        }
    }
}

我还想让罗盘成为一个单独的类,可以将数据发送到活动中。

同样的假设和问题:指南针会被多种活动使用吗?如果不是,最好将其作为单个活动的内部类。如果有多个客户机活动,请考虑使用启动-服务。它可以使用本地广播或事件总线(如绿色机器人 )通知传感器事件的活动。

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

https://stackoverflow.com/questions/31356908

复制
相关文章

相似问题

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