在服务类中建立PubNub订阅所需的最低代码是什么? PubNub上的示例包括启动订阅,广播接收器,pushalarms等的代码。我是否相信来自github的所有this代码都是最低要求?
我问的原因是因为我是自学代码,而且实现PubNub等服务的时间相当粗糙,因为他们的文档是针对我尚未达到的程序员级别的。
我看一下这些例子,并尝试提取最基本,最简单的必需品,但我不确定哪些可以从这些示例类中删除。
感谢有兴趣了解我想要问的人。
编辑:要明确这是我当前的PubNub服务类:
public class PubNubService extends Service {
SharedPreferences sP;
static final String pub_key = " - ";
static final String sub_key = " - ";
Pubnub pubnub = new Pubnub(pub_key, sub_key, false);
String channel;
PowerManager.WakeLock wl = null;
private final Handler handler = new Handler() {
public void handleMessage(Message msg) {
String pnMsg = msg.obj.toString();
final Toast toast = Toast.makeText(getApplicationContext(), pnMsg, Toast.LENGTH_SHORT);
toast.show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
toast.cancel();
}
}, 200);
}
};
private void notifyUser(Object message) {
Message msg = handler.obtainMessage();
try {
final String obj = (String) message;
msg.obj = obj;
handler.sendMessage(msg);
Log.i("Received msg : ", obj.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
public void onCreate() {
super.onCreate();
Toast.makeText(this, "PubnubService created...", Toast.LENGTH_LONG).show();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SubscribeAtBoot");
if (wl != null) {
wl.acquire();
Log.i("PUBNUB", "Partial Wake Lock : " + wl.isHeld());
Toast.makeText(this, "Partial Wake Lock : " + wl.isHeld(), Toast.LENGTH_LONG).show();
}
Log.i("PUBNUB", "PubnubService created...");
try {
pubnub.subscribe(new String[] {channel}, new Callback() {
public void connectCallback(String channel) {
notifyUser("CONNECT on channel:" + channel);
}
public void disconnectCallback(String channel) {
notifyUser("DISCONNECT on channel:" + channel);
}
public void reconnectCallback(String channel) {
notifyUser("RECONNECT on channel:" + channel);
}
@Override
public void successCallback(String channel, Object message) {
notifyUser(channel + " " + message.toString());
}
@Override
public void errorCallback(String channel, Object message) {
notifyUser(channel + " " + message.toString());
}
});
} catch (PubnubException e) {
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (wl != null) {
wl.release();
Log.i("PUBNUB", "Partial Wake Lock : " + wl.isHeld());
Toast.makeText(this, "Partial Wake Lock : " + wl.isHeld(), Toast.LENGTH_LONG).show();
wl = null;
}
Toast.makeText(this, "PubnubService destroyed...", Toast.LENGTH_LONG).show();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
以上此服务是从this示例复制而来的。我打电话从我的MainActivity启动此服务。我用onCreate方法称之为:
Intent serviceIntent = new Intent(this, PubNubService.class);
startService(serviceIntent);
Android Studio对我的一件事是,Handler类应该是静态的,否则会发生泄漏。当我运行我的应用程序时,出现的错误是: [错误:128-0]:无法获取响应代码。请联系支持部门,提供错误详情无法解析主机“pubsub-1.pubnub.com”:没有与主机名相关联的地址 。在下一行 [错误:100-1]:发生超时 。
我的Android Manifest添加了以下内容:
<service android:name=".PubNubService"/>
答案 0 :(得分:0)
最简单的例子就是在一个Activity中添加所有代码。以下所有代码均可在PubNub Android SDK docs page中找到。
import com.pubnub.api.*;
import org.json.*;
Pubnub pubnub = new Pubnub("your_pub_key", "your_sub_key");
pubnub.subscribe("channel1", new Callback() {
@Override
public void connectCallback(String channel, Object message) {
System.out.println("SUBSCRIBE : CONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
}
@Override
public void disconnectCallback(String channel, Object message) {
System.out.println("SUBSCRIBE : DISCONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
}
public void reconnectCallback(String channel, Object message) {
System.out.println("SUBSCRIBE : RECONNECT on channel:" + channel
+ " : " + message.getClass() + " : "
+ message.toString());
}
@Override
public void successCallback(String channel, Object message) {
System.out.println("SUBSCRIBE : " + channel + " : "
+ message.getClass() + " : " + message.toString());
// this is the messages received from publish
// add these messages to a list UI component
}
@Override
public void errorCallback(String channel, PubnubError error) {
System.out.println("SUBSCRIBE : ERROR on channel " + channel
+ " : " + error.toString());
}
}
);
Callback callback = new Callback(){ public void successCallback(String channel,Object response){ 的System.out.println(response.toString()); } public void errorCallback(String channel,PubnubError error){ 的System.out.println(error.toString()); } }; pubnub.publish(“my_channel”,“来自PubNub Java SDK的Hello!”,回调);
您可能需要进行一些更改。首先,您应该创建一个click方法,其中包含绑定到界面上按钮的发布。正如subscribe方法的successCallback中所述,您需要在Activity上的UI组件中显示消息。
那应该为你做。
但实际上没有什么比使用服务将消息作为Intent转发给Activity的Subscribe at Boot sample app更简单。
阻止设备启动时启动服务
启动(启动)设备时启动订阅示例的事实是配置问题。您可以更改清单,以便仅在启动应用程序时启动清单。请参阅SO线程Trying to start a service on boot on Android并撤消使其在启动时启动的部分。
这里有关于Android Services
的大量有用信息此SO主题“Is leaving a pubnub subscription open in a service optimal”
中的详细信息