【问题标题】:Android Service for PubNubPubNub 的 Android 服务
【发布时间】:2016-01-28 23:55:27
【问题描述】:

我已经实现了 PubNub 订阅和发布代码。我的代码在活动中运行良好。但现在我想在服务类的帮助下在后台执行该代码。我创建了扩展IntentService 的类。我正在以onCreate 方法订阅pubnub 频道。但是每当我运行应用程序服务时,它会立即停止而不显示 pubnub 状态。我收到以下 pubnub 错误。我也链接了 pubnub 所需的库。

04-09 23:39:32.621: D/Service Message(10033): error[Error: 100-1] : Timeout Occurred

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void startService(View v){
        startService(new Intent(this, MyService.class));
    }

    public void stopService(View v){
        stopService(new Intent(this, MyService.class));
    }


}

PubnubHandler.java

public class PubnubHandler{

    public static final String GLOBAL_CHANNEL = "my_channel_name";
    public static final String PUBLISH_KEY = 
            "my_publish_key";
    public static final String SUBSCRIBE_KEY = 
            "my_subscribe_key";
    private Context context;
    private Pubnub pubnub;


    public PubnubHandler(Context context) {

        this.context = context;
        pubnub = new Pubnub(PUBLISH_KEY, SUBSCRIBE_KEY);
        pubnub.setRetryInterval(1000);
    }

    public void notifyUser(String message) {

        final String msg = message;
        Handler handler = new Handler(Looper.getMainLooper());

        handler.post(new Runnable() {

            @Override
            public void run() {

                Toast.makeText(context, msg, 0).show();

            }
        });



    }

    public void subscribe() {

        Callback callback = new Callback() {
            @Override
            public void connectCallback(String channel, Object message) {
                Log.d("Service Message", "Subscribed");
            }

            @Override
            public void disconnectCallback(String channel, Object message) {
                Log.d("Service Message", "Disconnected");
            }

            public void reconnectCallback(String channel, Object message) {
                Log.d("Service Message", "Reconnected");
            }

            @Override
            public void successCallback(String channel, final Object message) {
                Log.d("Service Message", "Message : "+message.toString());
            }

            @Override
            public void errorCallback(String channel, PubnubError error) {
                Log.d("Service Message", "error"+error.toString());
            }
        };

        try {
            pubnub.subscribe(GLOBAL_CHANNEL, callback);
        } catch (PubnubException e) {
            System.out.println(e.toString());
        }
    }

    public void unsubscribe() {
        pubnub.unsubscribe(GLOBAL_CHANNEL);
    }

    public void publish(String message) {

        Callback callback = new Callback() {
            public void successCallback(String channel, Object response) {

            }
            public void errorCallback(String channel, PubnubError error) {

                notifyUser("Something went wrong. Try again.");
            }
        };
        pubnub.publish(GLOBAL_CHANNEL, message , callback);


    }

}

MyService.java

public class MyService extends IntentService {

    public MyService() {
        super("My Service");
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Toast.makeText(this, "Service Created", 1).show();
        new PubnubHandler(this).subscribe();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service Destroyed", 1).show();
    }

    @Override
    protected void onHandleIntent(Intent arg0) {

    }
}

清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.servicedemo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".MyService" >
        </service>
    </application>

</manifest>

【问题讨论】:

  • 嗨 Gaurav。感谢您使用 PubNub 询问 Android 上的背景。 PubNub的工作人员已经多次解决了这个问题。您可以发送快速电子邮件至 support@punbub.com 了解详细信息:-)
  • 你能把答案贴出来吗?
  • @PubNub:那么为什么不在此处发布答案并帮助未来的访问者避免再次询问。如果您已经对另一个问题这样做了,请将此帖子标记为重复。
  • 这可能会直接回答您的问题,但可能会对与 PubNub 相关的 Android 服务有所帮助。 stackoverflow.com/questions/35051528/…
  • 只是好奇你是否联系了 PubNub 支持。如果您还没有,您应该提供捕获此问题重现的日志文件。你可以generate logs by using the PubNub debug jar。如果我们在那里解决它,我们将在此处发布答案。

标签: java android broadcastreceiver android-service pubnub


【解决方案1】:

您应该始终在IntentServiceonHandleIntent() 中完成工作,而不是在onCreate() 中。因为您的IntentService 立即停止,原因是您没有向onHandleIntent() 提供任何代码。当onHandleIntent() 完成并且没有任何其他startService() 调用时,IntentService 总是会自行关闭。

但是,在您的情况下,对 PubNub API 的调用是异步的,因此已经在后台发生。也许你根本不需要IntentService。如果您想创建一个模型对象来保留在Activity 的配置更改后仍然存在的数据,请考虑使用headless Fragment 或普通Service

【讨论】:

    【解决方案2】:

    尝试从简单的Service 扩展MyService 而不是IntentServiceIntentService 在最后一个任务完成后调用 stopSelf()。这意味着不会有与PubnubHandler 关联的Context,并且系统可以杀死正在运行订阅内容的Thread

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多