2013-04-18 8 views
12

मेरे पास एक इरादा सेवा है जो कई गीगाबाइट वीडियो डाउनलोड करती है। अगर "गलती से" शुरू करें या जो भी हो, तो डाउनलोड को रोकने के लिए मेरे पास "स्टॉप" बटन है। मुझे पता है कि यह दो बार पूछा गया है लेकिन मेरे लिए कोई जवाब नहीं है।स्टॉप इंटेंट सेवा को कैसे प्रगति पर बल देना है?

मैं stopService() पर कॉल करने का प्रयास करता हूं, काम नहीं करता है। यह सिर्फ IntentService.OnDestroy() पर कॉल करता है। मैंने को onDestroy के अंदर कॉल करने का प्रयास किया, या तो काम नहीं करता है।

मैंने ध्वज की तरह कुछ करने की कोशिश की, लेकिन हैडलइन्टेंट को पहले से चलने पर कॉल नहीं किया जाता है, यह तब तक इंतजार करता है जब तक कि वर्तमान कार्य समाप्त नहीं हो जाता है और तब निष्पादित होता है। और यहां तक ​​कि अगर यह काम करता, तो मुझे कथन के बारे में कुछ विशाल होना होगा, जो

मेरा एकमात्र विकल्प है जो वास्तव में इसे नियमित सेवा में फिर से लिखना है?

//

public class SyncService extends IntentService { 

    boolean isCanceled; 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     if (intent.hasExtra("action")) { 

      // Set the canceling flag 
      isCanceled= intent.getStringExtra("action").equals("cancel"); 

     } 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     // Clean up the possible queue 
     if (intent.hasExtra ("action")) { 
      boolean cancel = intent.getStringExtra ("action"). Equals ("cancel"); 
      if (cancel) { 
       return; 
      } 
     } 

     ... 

     Get your inputStream from HttpUrlConnection or whatever 

     ... 

     while ((bytesRead = in.read(buffer)) > 0) { 
      if (isCanceled) { 
       isCanceled = false; 
       break; 
      } 

      ... 
     } 

    } 
} 

उत्तर और साथ

Intent intent = new Intent(context, SyncService.class); 
intent.putExtra("action", "cancel"); 
context.startService(intent); 
+3

आप अपने प्रश्न से अपने समाधान को हटाने और इसके बजाय इसे समाधान के रूप में प्रदान करने पर विचार कर सकते हैं। – jbaums

उत्तर

12

आप दो अलग-अलग मुद्दे हैं यह गति प्रदान, मुझे लगता है कि होगा:

  1. कैसे वर्तमान डाउनलोड रोकने के लिए

  2. कैसे ऊपर पंक्तिबद्ध बंद करने के लिए डाउनलोड, कि मौजूदा एक के बाद अमल करना चाहिए पूरा करता

पहले एक होना करने के लिए जा रहा है "एक ध्वज की तरह कुछ", आप के रूप में आप डेटा डाउनलोड जाँच करें कि। अन्यथा, आपके डाउनलोड ऑपरेशन को रोकने के लिए कुछ भी नहीं जा रहा है। यदि आप एक ठेठ HttpUrlConnection नुस्खा का उपयोग कर रहे हैं, तो आप उस लूप को अपने लूप में चेक करें जहां आपने HTTP InputStream से पढ़ा है और अपने FileOutputStream पर लिखें। आपने एक विशेष Intent संरचना के साथ startService() पर कॉल के माध्यम से उस ध्वज को सेट किया है, इसे "रद्द करें" ऑपरेशन के रूप में पहचानते हुए। IntentService में onStartCommand() को ओवरराइड करने की आवश्यकता होगी, Intent पर देखें, अगर इसे Intent रद्द करें, या किसी अन्य प्रकार के Intent के लिए सुपरक्लास पर श्रृंखला को ध्वज सेट करने के लिए इसका उपयोग करें।

यदि आप भी अन्य आदेशों को कतारबद्ध कर सकते हैं (परिदृश्य # 2), तो आपको उस ध्वज को onHandleIntent() के शीर्ष पर भी देखना होगा।

+0

हां ठीक वैसे ही आप कहते हैं। अगर मैं इसे किसी सेवा में लिखता हूं, तो क्या मैं इसे मजबूती से बंद कर पाऊंगा या यह वही बात होगी जैसा कि यहां है? – urSus

+0

@VlastoBennyLava: यह वही बात होगी जैसा कि कम या ज्यादा है।ध्वज सेट करने के लिए आपके पास शायद 'stopService()' और 'onDestroy() 'का उपयोग करने की बेहतर क्षमता होगी, लेकिन आपको अपना खुद का पृष्ठभूमि थ्रेड और कार्य कतार प्रबंधित करना होगा। – CommonsWare

+0

मैंने अपने प्रश्न को उत्तर छद्म कोड के साथ संपादित किया है, तो आप इसे देखना चाहेंगे। धन्यवाद – urSus

2

यह देखते हुए कि आप पोस्ट नहीं किया है आप कैसे वीडियो डाउनलोड संभाल रहे हैं वास्तव में, यह काम नहीं हो सकता है (वहाँ onHandleIntent अंदर पाश के कुछ प्रकार जहां डाउनलोड क्रियान्वित कर रहे हैं हो सकता है)। आप IntentService के अंदर एक स्थिर श्रेणी चर का उपयोग कर सकते हैं जिसमें डाउनलोड की रोक/प्रारंभ स्थिति है, ताकि इसे Activity द्वारा सेट किया जा सके। फिर, onHandleIntent के अंदर, आपको नियमित रूप से राज्य की जांच करनी होगी ताकि यह पता चल सके कि संचालन रद्द करना कब होगा।

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