我在我的应用中使用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);
(没有任何反应,没有任何响应)。
有什么想法吗?
答案 0 :(得分:2)
您正在询问使用PubNub订阅功能的PubNub Android API,以便在Android移动电话设备上接收远程消息。关于你正在使用的单身模式,这看起来很好! :-)
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方法调用放在一个新的Thread中,在收到来自回调的更新时向父节点发送更新:
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()就是你的答案。
答案 1 :(得分:1)
不要在cypherkey上传递null,只需传递“”。 我得到一个空的异常而没有触发消息到达事件。
替换这个: pubnub = new Pubnub(publishKey,subscribeKey,secretKey,null,false);
由此: pubnub = new Pubnub(publishKey,subscribeKey,secretKey,“”,false);