AsyncTask में संदर्भ प्राप्त करना


83

मैं अपने AsyncTask में इस संदर्भ को प्राप्त करने की कोशिश कर रहा हूँ जिसे Opciones कहा जाता है (यह वर्ग केवल एक ही है जो उस कार्य को कहता है) लेकिन मुझे नहीं पता कि यह कैसे करना है, मैंने कुछ कोड इस तरह देखे:

      protected void onPostExecute(Long result) {

    Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}

लेकिन यह मेरे लिए काम नहीं करता है यह कहता है: "No enclosing instance of the type Opciones in scope"


4
क्या Opciones एक गतिविधि है? यदि नहीं, तो आपको उस वर्ग के लिए एक संदर्भ देने की आवश्यकता है और फिर उस में उपयोग करेंAsyncTask
Torben Kohlmeier

जवाबों:


176

आपको निम्नलिखित चीजों को करने की आवश्यकता है।

  • जब आप AsyncTask का उपयोग करना चाहते हैं , तो अन्य वर्ग MyCustomTask का विस्तार करें
  • नए वर्ग के निर्माण में, प्रसंग पास करें

उदाहरण

public class MyCustomTask extends AsyncTask<Void, Void, Long> {

    private Context mContext;

    public MyCustomTask (Context context){
         mContext = context;
    }

    //other methods like onPreExecute etc.
    protected void onPostExecute(Long result) {
         Toast.makeText(mContext,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
    }
}

और निम्नलिखित के द्वारा तत्काल वर्ग।

MyCustomTask task = new MyCustomTask(context);
task.execute(..);

36
ध्यान दें कि गैर-नेस्टेड या स्थिर वर्ग का उपयोग करना बेहतर होगा और मेमोरी लीक से बचने के लिए एक कमजोर संदर्भ में mContext को
पकड़ें

8
नेस्टेड स्टैटिस्टिकल क्लास थ्रो में स्मृति रिसाव की चेतावनी के संदर्भ में
अमीर होसेन घासेमी

2
और नेस्टेड-क्लास में नॉन-स्टैटिक क्लास रखने के कारण पूरी क्लास मेमोरी लीक की चेतावनी देती है! इसलिए हमें स्मृति रिसाव के बिना संदर्भ का उपयोग करना चाहिए !?
अमीर होसैन घासेमी

1
स्मृति रिसाव को हल करने का एक तरीका खोजें, संदर्भ एक कमजोर श्रेणी होना चाहिए।
अमीर होसैन घासेमी

यह स्थिर वर्ग नहीं होगा। इसके सार्वजनिक वर्ग और फिर अलग गतिविधि को परिभाषित करने की जरूरत है। लेकिन हाँ, सुरक्षित पक्ष के लिए, हम WeakReference का उपयोग कर सकते हैं।
चिंतन राठौड़

59

होस्ट गतिविधि के लिए एक कमजोर संदर्भ रखने से मेमोरी लीक को रोका जा सकेगा।

static class MyTask extends AsyncTask<Void, Void, Void> {
    // Weak references will still allow the Activity to be garbage-collected
    private final WeakReference<Activity> weakActivity;

    MyTask(Activity myActivity) {
      this.weakActivity = new WeakReference<>(myActivity);
    }

    @Override
    public Void doInBackground(Void... params) {
      // do async stuff here
    }

    @Override
    public void onPostExecute(Void result) {
      // Re-acquire a strong reference to the activity, and verify
      // that it still exists and is active.
      Activity activity = weakActivity.get();
      if (activity == null
          || activity.isFinishing()
          || activity.isDestroyed()) {
        // activity is no longer valid, don't do anything!
        return;
      }

      // The activity is still valid, do main-thread stuff here
    }
  }

1
जब हम सक्रियता (asyntask को रोकना और फिर से शुरू करना) के बीच स्विच करते हैं, और फिर वापस आते हैं, तो क्या यह कमजोरियों अभी भी सक्रिय है?
D4rWiNS

1
क्या मायएक्टिविटी पास करने के बजाय कमजोर वर्ग को कक्षा में पास करने का लाभ है?
मांग

1
@seekingStillness कमजोर संदर्भ अभी भी गतिविधि को कचरा एकत्र करने की अनुमति देगा, जिससे मेमोरी रिसाव को रोका जा सके।
साईं

13

चूँकि केवल एक ही व्यक्ति Activityइस कार्य का उपयोग करता है, इसलिए इसे उसी का एक आंतरिक वर्ग बनाएंActivity

public class Opciones extends Activity
{
     public void onCreate()
     {
         ...
     }

    public class MyTask extends AsyncTask<>
    {
        ...

         protected void onPostExecute(Long result) {
        Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
     }
}

तब आपके पास Activityइसके और इसके सदस्य चर तक पहुंच हैContext


2
लिंट मेमोरी लीक के बारे में एक चेतावनी दिखाता है यदि AsyncTask क्लास स्थिर नहीं है।
सापूसवेन

@SapuSeven याद रखें कि यह सिर्फ एक चेतावनी है । मुझे व्यक्तिगत रूप से नहीं लगता है कि यह एक मुद्दा होना चाहिए अगर सही ढंग से इस्तेमाल किया जाए जैसे AsyncTaskकि अल्पकालिक संचालन के लिए और अक्सर एक में विचारों को अपडेट करने के लिए ActivityonPause()यदि वे अभी भी चल रहे हैं तो उन्हें रद्द करना अक्सर एक अच्छा विचार है । शायद मैं गलत हूं, लेकिन उन पर हमेशा मेरे विचार रहे हैं। यहाँ इस विषय पर कुछ और पढ़ना है
कोडमजिक जूल

-6

आप लिख सकते हैं getApplicationContex()। या वैश्विक चर को परिभाषित करें।

Activity activity;

और onCreate()समारोह में

activity = this;

फिर,

 protected void onPostExecute(Long result) {

    Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.