5

मेरा आवेदन AsyncTask शुरू करता है जो एक यूआरएल से एक फाइल डाउनलोड करता है। साथ ही यह एक स्टेटस बार Notification बनाता है जो उपयोगकर्ता को डाउनलोड के प्रतिशत को पूरा करता है।एंड्रॉइड: मैं स्टेटस बार अधिसूचना द्वारा बनाए गए लंबित इंटेंट से AsyncTask तक कैसे पहुंचूं?

मैं अधिसूचना पर क्लिक करने के लिए अपना आवेदन जवाब देने की कोशिश कर रहा हूं। यदि डाउनलोड अभी भी प्रगति पर है, तो मैं DialogInterface दिखाना चाहता हूं जो उनसे पूछता है कि क्या वे डाउनलोड को रोकना चाहते हैं। हाँ पर क्लिक करने से डाउनलोड बंद होना चाहिए।

मेरी समस्या यह है कि मुझे यकीन नहीं है कि मैं PendingIntent से अपने Async कार्य को कैसे एक्सेस कर सकता हूं जिसे मैंने अधिसूचना के लिए सेट किया था। मैं आसानी से दिखाने के लिए DialogInterface प्राप्त कर सकता हूं, लेकिन मुझे यकीन नहीं है कि गतिविधि को कैसे दिखाया जा रहा है, जहां डाउनलोड बंद करना है।

मैंने एक सहायक वर्ग बनाने की कोशिश की जिसमें अधिसूचना तक पहुंच थी और फाइल ऑब्जेक्ट डाउनलोड करने योग्य फ़ाइल का जिक्र है, लेकिन मुझे यह कहते हुए एक त्रुटि मिलती है कि ऑब्जेक्ट धारावाहिक नहीं है (यह Serializable लागू करता है)। सहायक वर्ग में एक सदस्य भी शामिल था जो डाउनलोड की प्रगति को बनाए रखेगा, जो मैं इस बात के लिए उपयोग करता हूं कि संवाद दिखाने के लिए या नहीं।

मैं ब्रॉडकास्ट एक्शन और रिसीवर का उपयोग करने के बारे में सोच रहा था, लेकिन मुझे यकीन नहीं है कि रिसीवर कहां रखा जाए। क्या यह कक्षा में जाएगा जो AsyncTask बढ़ाता है?

किसी भी मदद की सराहना की जाएगी। यह PendingIntentNotification से जुड़ा हुआ है। यदि आप अधिक कोड देखना चाहते हैं, तो बस पूछें।

public class DownloadNotificationActivity extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i = getIntent(); 

    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      switch (which) { 
       case DialogInterface.BUTTON_POSITIVE : 
        // Yes button clicked 
        // Stop download 
        finish(); 
        break; 

       case DialogInterface.BUTTON_NEGATIVE : 
        // No button clicked 
        finish(); 
        break; 
      } 
     } 
    }; 

    if (/* download not complete */) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.stop_download). 
       setPositiveButton(R.string.yes, dialogClickListener). 
       setNegativeButton(R.string.no, dialogClickListener).show(); 
    } 
    else { 
     // Access file 
    } 

} 
} 

तो स्पष्ट होने के लिए, मेरे पास ViewDetailActivity कक्षा है। इसमें DownloadFile नामक एक आंतरिक वर्ग है जो AsyncTask बढ़ाता है और जब उपयोगकर्ता स्क्रीन पर एक बटन क्लिक करता है तो उसे निष्पादित किया जाता है। doInBackground()DownloadFile की विधि में, एक एमपी 3 का एक डाउनलोड यूआरएल से शुरू होता है और स्टेटस बार Notification डाउनलोड की गई फाइल की मात्रा के आधार पर बनाया और अपडेट किया जाता है। के PendingIntentDownloadNotificationActivity (कोड दिखाए गए) के साथ बनाया गया है और इसे "हाँ" चुना गया एक संवाद दिखाना चाहिए, AsyncTask में डाउनलोड को रद्द करना चाहिए।

मेरे मुद्दा यह है कि मैं शब्द वापस DownloadFile कार्य है कि डाउनलोड करने के लिए रद्द कर दिया गया प्राप्त करने की आवश्यकता है और मैं इसे रद्द करने के लिए DownloadNotificationActivity से DownloadFile तक पहुंचने का तरीका यकीन नहीं है।

अग्रिम धन्यवाद!

उत्तर

1

अपने asynctask में, आपको doInBackground() में जांचने और रद्द होने पर निरस्त करने की आवश्यकता है। आपकी अधिसूचना से, आप asynctask पर cancel() पर कॉल करें।

ऐसा करने के लिए आपको AsyncTask पर अपनी सूचना गतिविधि में संदर्भित करने की आवश्यकता है।

उदाहरण के लिए:

आप इस तरह AsyncTask बनाएँ:

class MyAsyncTask extends AsyncTask<Void, Integer, Void> { 
     @Override 
     protected Void doInBackground(Void... unused) { //be sure to check isCancelled here, i.e. if (isCancelled()) break; 
फिर अपने मुख्य Activity में

आपके द्वारा बनाए गए AsyncTask की तरह:

public class MyActivity extends Activity { 
    private MyAsyncTask zeTask; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
       zeTask= new MyAsyncTask(); 
       zeTask.execute(); 
फिर

, जब आप सूचना बनाएं और async कार्य को रद्द करना चाहते हैं बस इसे zeTask के रूप में देखें। MyAsyncTask को उसी गतिविधि में होना आवश्यक है क्योंकि अधिसूचना और zeTask एक चर हो सकता है जो आपके AsyncTask का संदर्भ रखता है।

switch (which) { 
       case DialogInterface.BUTTON_POSITIVE : 
        zeTask.cancel(); 
        finish(); 
        break; 
+0

यही मुद्दा है कि मैं वास्तव में उपरोक्त गतिविधि में 'AsyncTask' का संदर्भ दे रहा हूं। मैंने 'AsyncTask' पर 'Serializable' को लागू करने का प्रयास किया और' लंबवत ') के रूप में स्थापित' इराद 'पर' putExtra() 'का उपयोग किया, लेकिन मुझे यह अपवाद मिला कि यह वस्तु क्रमबद्ध नहीं है। क्या AsincTask को मेरी गतिविधि में संदर्भित करने का कोई और तरीका है? – Shino

+0

ठीक है मुझे लगता है कि जिस तरह से मैं इसे कर रहा हूं बस काम नहीं करेगा। जब मैंने स्टेटस बार अधिसूचना पर क्लिक किया था तो अधिसूचना कार्य मैंने केवल 'लंबित इंटेन्टेंट' के रूप में उपयोग के लिए किया था। 'AsyncTask' वास्तव में कक्षा में था जिसने स्क्रीन को संभाला जहां आप फ़ाइल डाउनलोड करने के लिए क्लिक कर सकते हैं। लगता है जैसे मुझे अपने 'AsyncTask' को' DownloadNotificationActivity' पर ले जाने की आवश्यकता है और उसे उस कक्षा के 'क्रेटेट' में निष्पादित करना है। फिर अधिसूचना के लिए 'onClick' ईवेंट को संभाल लें। मैं आपको बता दूंगा कि क्या होता है। – Shino

+0

मेरी पिछली टिप्पणी में मैंने जो कहा वह कोशिश नहीं कर सका। आपकी सहायता @Motes के लिए धन्यवाद। मैंने विषय को अधिक जानकारी (नीचे) के साथ अद्यतन किया है। मुझे लगता है कि मैं इस बारे में गलत तरीके से जा रहा हूं। मुझे अन्य विकल्पों की तलाश करनी है। मैंने 'ब्रॉडकास्ट' और 'ब्रॉडकास्ट रिसीवर' की कोशिश करने के बारे में सोचा लेकिन मुझे यकीन नहीं है कि एक 'AsyncTask' पर रिसीवर कितनी अच्छी तरह से काम करेगा। – Shino

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