Android Pusher Singleton 频道订阅

Android Pusher Singleton channel subscription

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

这是我在每个 activity/fragment

中编写的代码
 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);
                        }
                    });
                }
            });

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

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);
                    }
                });
            }


        });


    }

您可以在 Global class 中公开 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;
}

然后在您的 activity/fragment 中,您可以 bind/unbind 您的听众何时 resumed/paused - 只需像这样保留对它的引用:

YourActivity.java(也可以是你的片段)

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);
}

希望对您有所帮助:)