Java PubNub的Android服务
我已经实现了PubNub订阅和发布代码。我的代码在活动中运行良好。但现在我想在服务类的帮助下在后台执行该代码。我已经创建了扩展Java PubNub的Android服务,java,android,broadcastreceiver,android-service,pubnub,Java,Android,Broadcastreceiver,Android Service,Pubnub,我已经实现了PubNub订阅和发布代码。我的代码在活动中运行良好。但现在我想在服务类的帮助下在后台执行该代码。我已经创建了扩展IntentService的类。我正在用onCreate方法订阅pubnub频道。但是,每当我运行应用程序时,服务会立即停止,而不显示pubnub状态。我得到以下pubnub错误。我也链接了pubnub所需的库 04-09 23:39:32.621: D/Service Message(10033): error[Error: 100-1] : Timeout Occur
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));
}
}
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);
}
}
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) {
}
}
PubnubHandler.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));
}
}
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);
}
}
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) {
}
}
MyService.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));
}
}
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);
}
}
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>
您应该始终在
IntentService
的onhandlecontent()
中执行工作,而不是在onCreate()
中。您的IntentService
立即停止的原因是您没有向onHandleIntent()
提供任何代码IntentService
总是在onHandleIntent()
完成并且没有任何其他startService()
调用时自动关闭
不过,在您的情况下,对
PubNub
API的调用是异步的,因此已经在后台发生了。也许您根本不需要IntentService
。如果您想创建一个模型对象来保存数据,它将生存在<代码>活动< /代码>的配置更改中,考虑使用“或”<代码>服务> /代码> .< /p> < p>尝试从简单<代码>服务< /代码>中扩展<代码> MyService < /代码>,而不是<代码> ItnService < /代码>。code>IntentService在上一个任务刚刚完成后调用stopSelf()
。这意味着将没有与PubnubHandler
关联的上下文
,系统可以在运行subscribe stuff的地方杀死线程。Hi Gaurav。感谢您询问有关使用PubNub的Android的背景信息。PubNub的工作人员已经多次解决了这个问题。您可以向发送一封快速电子邮件support@punbub.com详细信息:-)你能发布答案吗?@PubNub:那么为什么不在这里发布答案,帮助未来的访问者避免再次提问。如果你已经对另一个问题这样做了,那么请将这篇文章标记为重复。这可能会直接回答你的问题,但可能会对Android服务整体有所帮助,因为它与PubNub相关。只是好奇你是否联系了PubNub的支持人员。如果没有,您应该提供记录此问题的日志文件。你可以。若我们在那个里解决了它,我们将把答案放回这里。@Dmide-Sure,正如我所理解的那个样,subscribe是异步调用: