java android broadcastreceiver android-service pubnub

java - Servicio de Android para PubNub



broadcastreceiver android-service (2)

He implementado PubNub suscribirme y publicar código. Mi código está funcionando bien en la actividad. Pero ahora quiero ejecutar ese código en segundo plano con la ayuda de la clase de servicio. He creado mi clase extendiendo el IntentService . Y estoy suscribiéndome al canal de onCreate en el método onCreate . Pero cada vez que ejecuto el servicio de la aplicación, se detiene inmediatamente sin mostrar el estado de la publicación. Estoy recibiendo siguiente error de pubnub. He vinculado bibliotecas requeridas de pubnub también.

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) { } }

manifiesto

<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>


Intente extender MyService desde el Service simple Service lugar de IntentService . IntentService llama a stopSelf() justo después de que se completó la última tarea. Esto significa que no habría ningún Context asociado con PubnubHandler y que el sistema simplemente puede matar un Thread donde se está ejecutando la suscripción.


Siempre debe realizar el trabajo en IntentService ''s onHandleIntent() , no en onCreate() . La razón por la IntentService su IntentService detiene inmediatamente es que no ha proporcionado ningún código a onHandleIntent() . IntentService siempre se apaga cuando onHandleIntent() y no hubo otras llamadas a startService() .

En su caso, sin embargo, las llamadas a la API de PubNub son asíncronas y, por lo tanto, ya están en segundo plano. Tal vez usted no necesita IntentService aquí en absoluto. Si desea crear un objeto modelo para mantener los datos que sobrevivirán a los cambios de configuración de la Activity , considere usar Fragmento sin cabeza o Service simple.