2015-04-09 18 views
16

PubNub abone ve yayınlama kodunu uyguladım. Kodum etkinlik üzerinde çalışıyor. Ama şimdi bu kodu servis sınıfının yardımıyla arka planda çalıştırmak istiyorum. Sınıfımı IntentService'u genişleterek oluşturdum. Ve ben onCreate yönteminde pubnub kanalına abone oldum. Ancak, uygulama servisini çalıştırdığımda, pubnub durumunu göstermeden hemen durdu. Pubnub hatasını takip ediyorum. Pubnub için gerekli kütüphaneleri de bağladım.PubNub için Android Hizmeti

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

    } 
} 

tezahür

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

Merhaba Gaurav. PubNub ile Android hakkında Arkaplan'ı sorduğunuz için teşekkür ederiz. Bu PubNub personeli tarafından birçok kez çözüldü. Ayrıntılı bilgi için [email protected] adresine hızlı bir e-posta gönderebilirsiniz :-) – PubNub

+1

cevabını lütfen gönderebilir misiniz? – Blaasd

+1

@PubNub: bu yüzden neden * burada cevap vermeyin * ve gelecekteki ziyaretçilerin sormak zorunda kalmasına yardım edin * tekrar *. Başka bir soruyu zaten yaptıysanız, lütfen bu gönderiyi kopya olarak işaretleyin. –

cevap

3

Sen IntentService 'ın onHandleIntent() değil onCreate() in işi hep gerekmektedir. Nedeni, IntentService'un hemen durması nedeniyle onHandleIntent() numaralı telefona herhangi bir kod göndermediniz. IntentService, onHandleIntent() tamamlandığında kendisini kapatır ve başka hiçbir startService() çağrı olmadı. Sizin durumunuzda, PubNub API'sine yapılan çağrılar eşzamansızdır ve bu nedenle arka planda gerçekleşir. Belki de burada IntentService'a ihtiyacınız yok. Activity'un yapılandırma değişikliklerini koruyacak verileri tutmak için bir model nesne oluşturmak isterseniz, headless Fragment veya düz Service'u kullanmayı düşünün.

2

'u yerine Service numaralı telefondan genişletmeye çalışın. IntentService, son görev tamamlandıktan hemen sonra stopSelf()'u çağırır. Bu, PubnubHandler ile ilişkili olan Context'un bulunmayacağı anlamına gelir ve sistem, abone içeriklerinin çalıştığı Thread'u öldürebilir.

+0

düz hizmetin UI iş parçacığı – Dmide

+1

@Dmide Sure içinde çalıştığını hatırlıyorum, çünkü abone anormal olmayan çağrıdır: https://www.pubnub.com/docs/android-java/pubnub-java-sdk – birdy

İlgili konular