2015-04-09 5 views
16

के लिए एंड्रॉइड सर्विस मैंने PubNub सदस्यता ली है और कोड प्रकाशित किया है। मेरा कोड गतिविधि पर ठीक काम कर रहा है। लेकिन अब मैं सेवा वर्ग की मदद से पृष्ठभूमि में उस कोड को निष्पादित करना चाहता हूं। मैंने अपनी कक्षा IntentService का विस्तार किया है। और मैं onCreate विधि में पबनब चैनल की सदस्यता ले रहा हूं। लेकिन जब भी मैं ऐप सेवा चला रहा हूं तो तुरंत पबनब स्थिति दिखाए बिना रोक रहा है। मुझे निम्नलिखित पबनब त्रुटि मिल रही है। मैंने पबनब आवश्यक पुस्तकालयों को भी जोड़ा है।पबनब

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

हाय गौरव। PubNub के साथ एंड्रॉइड पर पृष्ठभूमि के बारे में पूछने के लिए धन्यवाद। यह PubNub कर्मचारियों द्वारा कई बार हल किया गया है। आप विवरण के लिए [email protected] पर एक त्वरित ईमेल भेज सकते हैं :-) – PubNub

+1

क्या आप उत्तर पोस्ट कर सकते हैं? – Blaasd

+1

@PubNub: तो क्यों नहीं * उस उत्तर को पोस्ट करें * और भविष्य के आगंतुकों को * फिर से पूछने से बचने में मदद करें *। यदि आपने पहले से ही किसी अन्य प्रश्न पर ऐसा किया है, तो कृपया इस पोस्ट को डुप्लिकेट के रूप में फ़्लैग करें। –

उत्तर

3

तुम हमेशा IntentService के onHandleIntent(), onCreate() में नहीं में काम करना चाहिए। इसका कारण यह है कि आपका IntentService तत्काल बंद हो जाता है कि आपने onHandleIntent() पर कोई कोड नहीं दिया है। onHandleIntent() समाप्त होने पर हमेशा बंद हो जाता है और कोई अन्य startService() कॉल नहीं था।

आपके मामले में, हालांकि, PubNub एपीआई पर कॉल अतुल्यकालिक हैं और इसलिए पृष्ठभूमि में पहले से ही होते हैं। शायद आपको IntentService की आवश्यकता नहीं है। यदि आप Activity के कॉन्फ़िगरेशन परिवर्तनों से बचने वाले डेटा को रखने के लिए मॉडल ऑब्जेक्ट बनाना चाहते हैं, तो headless Fragment या सादे Service का उपयोग करने पर विचार करें।

2

के बजाय Service से MyService का विस्तार करने का प्रयास करें। अंतिम कार्य पूरा होने के ठीक बाद IntentServicestopSelf() पर कॉल करता है। इसका मतलब है कि से जुड़े Context नहीं होंगे और सिस्टम केवल Thread को मार सकता है जहां सब्सक्राइब सामान चल रहा है।

+0

ध्यान रखें कि सादा सेवा यूआई थ्रेड – Dmide

+1

@Dmide निश्चित रूप से काम करती है, जैसा कि मुझे लगता है कि सब्सक्राइब एसिंक्रोनस कॉल है: https://www.pubnub.com/docs/android-java/pubnub-java-sdk – birdy

संबंधित मुद्दे