【问题标题】:Android Pusher Singleton channel subscriptionAndroid Pusher Singleton 频道订阅
【发布时间】:2017-09-05 05:48:01
【问题描述】:

您好,我已经为实时聊天和订阅推送器频道实现了推送器,但是我有很多活动和片段,我想在其中收听推送器事件。我已经在每个活动/片段中添加了这段代码,但问题是它为每个 id 创建了多个订阅。我知道我必须为此使用 Singleton 任何人都可以指出我正确的方向来实现这一目标吗?

这是我在每个活动/片段中编写的代码

 private PusherOptions options;
 private Channel channel;
 private Pusher pusher;    
 options = new PusherOptions();
 options.setCluster("ap2");
 pusher = new Pusher("afbfc1f591fd7b70190f", options);
 pusher.connect();

     profile_id = Global.shared().preferences.getString("PROFILE_ID", " ");

    channel = pusher.subscribe(profile_id);
    channel.bind("message",
            new SubscriptionEventListener() {
                @Override
                public void onEvent(String s, String s1, final String data) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                JSONObject result = new JSONObject(data);
                                String message = result.getString("message");
                                String time = result.getString("time");
                                String reId = result.getString("recieverId");
                                new_message = message;
                                getConvoData(k, message);

                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            System.out.println("DATA ====>>" + data);
                        }
                    });
                }
            });

【问题讨论】:

  • 您是否尝试过将 Pusher 实例化代码放入您的 Application 类中?这是实现每个应用程序仅一个实例的最简单方法,您可以从每个 Fragment/Activity 访问该实例。更好的方法是使用 Dagger 之类的东西进行依赖注入:google.github.io/dagger
  • 我能够正确实现这一点,非常感谢,现在你能建议我如何在我的活动/片段中反映这些变化,以便我可以更新我的适配器以监听这些推送事件,例如,我想在 ChatActivity 中收听“消息”事件并更新聊天计数器和聊天列表,如何通过将一些数据从全局类发送到特定活动来实现这一点,再次感谢。

标签: android pusher


【解决方案1】:

好吧,所以在尝试了一段时间后,我发现我自己创建了一个全局类,并向其中添加了推送代码,以便它在应用程序的整个生命周期中只维护一个连接

public class Global extends MultiDexApplication {

    @Override
        public void onCreate() {
            super.onCreate();

            SharedPreferences preferences = sharedInstance.getSharedPreferences(sharedInstance.getString(R.string.shared_preferences), Context.MODE_PRIVATE);
            sharedInstance.preferences = preferences;
            connectTopusher();


        }

 public void connectTopusher() {
        PusherOptions options;
        Channel channel;
        Pusher pusher;
        options = new PusherOptions();
        options.setCluster("ap2");
        pusher = new Pusher("afbfc1f591fd7b70190f", options);
        pusher.connect();
        String profile = Global.shared().preferences.getString("PROFILE_ID", "");
        channel = pusher.subscribe(profile);

        channel.bind("message",
                new SubscriptionEventListener() {
                    @Override
                    public void onEvent(String s, String s1, final String data) {
                        new Handler(Looper.getMainLooper()).post(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    JSONObject result = new JSONObject(data);
                                    String message = result.getString("message");
                                    String time = result.getString("time");
                                    String reId = result.getString("recieverId");

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                                System.out.println("DATA ====>>" + data);
                            }
                        });
                    }
                });


        channel.bind("status_change", new SubscriptionEventListener() {
            @Override
            public void onEvent(String s, String s1, final String data) {
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            JSONObject result = new JSONObject(data);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        System.out.println("DATA ====>>" + data);
                    }
                });
            }


        });


    }

【讨论】:

    【解决方案2】:

    您可以在Global 类中公开channel。这将允许您在片段中调用bindunbind,当它们在前台时。

    connectToPusher 应该创建一个频道并订阅它。

    Global.java:

    private Channel channel;
    
    public void connectTopusher() {
        PusherOptions options;
        Pusher pusher;
        options = new PusherOptions();
        options.setCluster("ap2");
        pusher = new Pusher("afbfc1f591fd7b70190f", options);
        pusher.connect();
        String profile = Global.shared().preferences.getString("PROFILE_ID", "");
        this.channel = pusher.subscribe(profile);
    }
    
    public Channel getChannel(){
        return this.channel;
    }
    

    然后在您的活动/片段中,您可以将侦听器绑定/取消绑定到它们何时恢复/暂停 - 只需像这样保留对它的引用:

    YourActivity.java(也可以是你的 Fragment)

    private SubscriptionEventListener messageListener = new SubscriptionEventListener(){
         @Override
        public void onEvent(String channel, String event, String data) {
            //TODO: do something with events
        }
    }
    
    //Bind when the listener comes into the foreground:
    @Override
    protected void onResume() {
        super.onResume();
    
        ((Global) getActivity().getApplication()).getChannel().bind("message", messageListener);
    
    }
    
    //Make sure to unbind the event listener!
    @Override
    protected void onPause() {
        super.onPause();
        ((Global) getActivity().getApplication()).getChannel().unbind("message", messageListener);
    }
    

    我希望这会有所帮助:)

    【讨论】:

    • 再次感谢,会试试这个方法
    • 非常感谢,你拯救了我的一天。这工作得很好。
    • 很高兴听到这个消息! :)
    猜你喜欢
    • 2013-08-10
    • 2014-07-15
    • 1970-01-01
    • 2015-06-05
    • 2017-05-12
    • 2016-07-14
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多