2012-08-31 16 views
6

तक पहुंचने का बेहतर तरीका यह काम करने के लिए मुझे कुछ समय लगा, लेकिन यह स्पष्ट रूप से सबसे अच्छा अभ्यास नहीं है। संक्षेप में, जब मेरा AsyncTask समाप्त होता है, तो मुझे एक संवाद दिखाने की आवश्यकता होती है, लेकिन GetAplicationContext() नहीं मिलती है, न ही AsyncTask बनाते समय इसे पैरामीटर के रूप में पास कर रहा है। तो मैं अपने AsyncTask वर्ग में संदर्भ के लिए एक सार्वजनिक चर घोषित कर दिया और यह सेट इससे पहले कि मैं पर अमल किया है:एंड्रॉइड AsyncTask गतिविधि संदर्भ

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 

private class RefreshRefPoints extends AsyncTask<Context, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

    protected Integer doInBackground(Context... ctx) { 
     Log.d("H","doInBackground()"); 
     dbHelper.clearRefPoints(); 
     requestRefPoints(); 
     nPoints = parseRefPointsCSV(); 

     return nPoints; 
    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 

    protected void onPreExecute() 
    { 
     pd = ProgressDialog.show(myCtx, "Refreshing Reference Points", "Loading...", true,false); 
     Log.d("H", "onPreExecute()"); 
    } 
    protected void onPostExecute(Integer result) { 
     pd.dismiss(); 
     AlertDialog.Builder builder = new AlertDialog.Builder(myCtx); 
     builder.setTitle("Reference points refresh complete"); 
     builder.setMessage(result+" records loaded"); 
     builder.setPositiveButton("OK",null); 
     builder.show(); 
     Log.d("H","onPostExecute()");  
    }...etc 

किसी को भी सिर्फ मुझे संदर्भ में उत्तीर्ण होने की उचित तरीके से दिखा सकते हैं? के रूप में

private OnClickListener clickLoadRefs = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d("H","Clicked Load Refs"); 
     RefreshRefPoints refreshRefPoints = new RefreshRefPoints(Your_ActivityName.this); 
     refreshRefPoints.myCtx=v.getContext(); 
     refreshRefPoints.execute(v.getContext()); 
    } 
}; 


private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    public Context myCtx; 
    private ProgressDialog pd; 

public RefreshRefPoints (Context ctx) { 
    myCtx = ctx; 
} 

उत्तर

12

निर्माता में

धन्यवाद

+1

लेकिन यह मेमोरी लीक –

2

दर्रा संदर्भ एक निर्माता विधि परिभाषित करें और संदर्भ एक पैरामीटर गुजरती हैं। उचित रहेगा कि।

मैं यहाँ क्या मतलब:

private class RefreshRefPoints extends AsyncTask<Void, Integer, Integer> { 

    private Integer nPoints=0; 
    private Context myCtx; 
    private ProgressDialog pd; 

    public RefreshRefPoints(Context ctx){ 
     // Now set context 
     this.myCtx = ctx; 
    } 

} 

सब है कि।

+0

धन्यवाद काम करना चाहिए, लेकिन मुझे डील इनबैकग्राउंड द्वारा ग्रहण से शिकायतें मिल रही हैं, अब मैंने आपके नमूने के अनुसार "AsyncTask " तक विस्तारित किया है? –

+1

डाल ** संरक्षित पूर्णांक doInBackground (** शून्य ** ...) { –

+0

में शून्य ** सब कुछ इस जवाब का मान टुकड़े के साथ अपमानजनक है ऐसा करने का आधुनिक संदर्भ में। नहीं पता था - – ed209

10

तुम भी YourActivityName.this का उपयोग गतिविधि Context का उल्लेख करने के कर सकते हैं। चूंकि सक्रियण संदर्भ बढ़ाते हैं, इसलिए ऐसा करने के लिए मान्य है।

+0

धन्यवाद देता! –

+1

ध्यान दें कि अगर अपनी गतिविधि instantiated नहीं है या मार डाला, एक NullPointerException में परिणाम होगा इस उत्तर में कोड बुला। –

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