Android Pusher Singleton频道订阅



您好,我已经实现了Pusher进行实时聊天并订阅了Pusher Channel,但是我有很多活动和片段,我想在其中收听Pushr事件。我已经在每个活动/片段中添加了此代码,但是问题是它为每个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);
                        }
                    });
                }
            });

好吧,所以尝试了一段时间后,我弄清楚了自己的自我,我创建了一个全局类,并向它添加了推动器代码,以便它仅维护一个连接的应用程序的整个生命周期

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类中公开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(也可能是您的片段)

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

我希望这会有所帮助:)

最新更新