3

我在我的应用程序中使用PubNub SDK for Android。我尝试订阅一个频道,但没有任何反应。

这是我连接到 pubnub 的代码:

public class MyPubnub {
    private static Pubnub pubnub = null;
    private static final String publishKey = "MY PUBLISH KEY";
    private static final String subscribeKey = "MY SUBSCRIBER KEY";
    private static final String secretKey = "MY SECRET KEY";

    private MyPubnub() {
    }

    public static Pubnub getPubnubObject() {
        if (pubnub == null) {
            pubnub = new Pubnub(publishKey, subscribeKey, secretKey, null,
                    false);
        }
        return pubnub;
    }
}


订阅pubnub的代码:

public void onCreate(Bundle b) {
    super.onCreate(b);
    initUI();
    Pubnub pn = MyPubnub.getPubnubObject();
    String channel = getChannelName();
    Reciver reciver = new Reciver();

    pn.subscribe(channel, reciver);
}
class Reciver implements Callback {

    @Override
    public boolean execute(Object message) {
        Log.d("PUBNUB", "message received [" + message.toString() + "]");
        return true;
    }
}


在调试过程中,我注意到一旦我尝试运行这一行,应用程序就会冻结:(pn.subscribe(channel, reciver);没有任何反应,没有任何反应)。

有什么想法吗?

4

2 回答 2

2

PubNub 安卓 SDK

您正在询问使用 PubNub 订阅功能在 Android 移动电话设备上接收远程消息的 PubNub Android API。关于您使用的单例模式,这看起来不错!:-)

PubNub Android SDK 文档: http ://www.pubnub.com/docs/java/android/android-sdk.html

但是,听起来您在订阅呼叫中被阻止了。您是否使用最新的 PubNub Android API - https://github.com/pubnub/java/tree/master/android - 最新的 API 应该允许您自动调用订阅 API 而不会阻止您的应用程序。但是,如果是这种情况,并且 subscribe() 方法确实阻塞了您的应用程序,您可以通过将此函数调用放在 Java 线程中并在新消息到达时向您的父主程序发送消息帖子来解决此问题。

所以最终的解决方案是将 PubNub 方法调用放在一个新线程中,在接收到来自回调的更新时向父级发送更新:

https://github.com/pubnub/java/tree/master/android

Thread t = new Thread() {
    public void run() {
        HashMap<String, Object> args = new HashMap<String, Object>(6);
        args.put("channel", _channel);

        // callback to get response
        args.put( "callback", new ReceivedMessage() );

        // Listen for Messages (Subscribe)
        _pubnub.subscribe(args);
    };
};
t.start();
threads.put(_channel, t);

然后你实现你的 ReceiveMessage() 类:https ://github.com/pubnub/java/tree/master/android - 查看源代码。

请注意,这不是完整的复制/粘贴答案,但它会让您指向正确的方向。此外,这种线程样式将向后兼容未来的升级。

所以最后,使用 Threads() 是你的答案。

于 2012-07-03T03:56:23.357 回答
1

不要在 cypherkey 上传递 null,只需传递“”。我得到一个空异常并且没有触发消息到达事件。

替换这个:pubnub = new Pubnub(publishKey, subscribeKey, secretKey, null, false);

通过这个: pubnub = new Pubnub(publishKey, subscribeKey, secretKey, "", false);

于 2013-01-20T16:55:13.717 回答