绝对最小的PubNub服务代码是什么样的?

时间:2016-01-26 04:13:24

标签: android pubnub

在服务类中建立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"/>

1 个答案:

答案 0 :(得分:0)

PubNub最小的Android示例代码发布&amp;订阅

最简单的例子就是在一个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组件中显示消息。

那应该为你做。

订阅Boot

但实际上没有什么比使用服务将消息作为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

中的详细信息