2013-03-14 3 views
8

मैं सोच रहा था कि AsyncTask को मुख्य गतिविधि (MainActivity.java) के अंदर थ्रेड चलाने के लिए उपयोग किया गया था।क्या मुझे मुख्य एक्टिविटी विस्तार गतिविधि के अंदर AsyncTask क्लास का उपयोग करना चाहिए?

उदाहरण के लिए मैं जब AsyncTask का उपयोग कर कई ट्यूटोरियल देखा वे मुख्य वर्ग Activity का विस्तार करने के बजाय के लिए कि AsyncTask (MyAsyncTask.java) class एक स्वतंत्र .java फ़ाइल बनाने के अंदर एक निजी वर्ग की घोषणा।

लेकिन मैंने देखा है कि जब एक स्वतंत्र फ़ाइल का उपयोग कर मैं चलाने के लिए सक्षम नहीं किया जा रहा हूँ runOnUIThread(), क्योंकि यह Activity वर्ग के अंतर्गत आता है, तो मैं कैसे है कि स्वतंत्र AsyncTask (MyAsyncTask अंदर इस विधि का उपयोग करने के लिए सक्षम हो जाएगा। जावा) जो AsyncTask और Activity नहीं बढ़ाता है।

+0

आप AsyncTask से runOnUIThread को क्यों कॉल करना चाहते हैं? TextViews को बदलने के लिए – EvilDuck

+0

, उन्हें अन्य धागे से बदला नहीं जा सकता है। – Alex

+0

आप यूपी को ऑनस्ट को अपडेट कर सकते हैं और PEEExecute –

उत्तर

12

यह पूरी तरह से ठीक है। मैं अक्सर ऐसा करता हूं लेकिन यह इस बात पर निर्भर करता है कि आप इसका उपयोग कैसे कर रहे हैं। यदि इसका उपयोग Activities द्वारा किया जा सकता है तो मैं इसे अपनी कक्षा या साझा कक्षा देता हूं। लेकिन अगर यह एक ही उद्देश्य के लिए है तो मैं इसे MainActivity का आंतरिक वर्ग बना दूंगा।

इसे एक आंतरिक वर्ग बनाने का लाभ यह है कि इसकी कक्षा वर्ग चर के लिए सीधे पहुंच है। यदि आप इसे एक अलग वर्ग बनाते हैं तो आपको params जैसे context या अन्य चरों में पास करने की आवश्यकता होने पर आपको इसके लिए एक कन्स्ट्रक्टर बनाने की आवश्यकता है।

मुझे नहीं पता कि आप क्या कर रहे हैं लेकिन मुझे यकीन नहीं है कि आपको runOnUiThread() की आवश्यकता है। आप अपने AsyncTask फ़ाइल में एक कन्स्ट्रक्टर बना सकते हैं और इसे context को एक परम के रूप में स्वीकार कर सकते हैं और जो भी आपको चाहिए। तो फिर तुम UIonPostExecute() में

उदाहरण

Public class MyAsyncTask extends AsyncTask 
{ 

private Context context; 

public MyAsyncTask(Context context) { // can take other params if needed 
    this.context = context; 
} 

// Add your AsyncTask methods and logic 
//you can use your context variable in onPostExecute() to manipulate activity UI 
}` 

अद्यतन कर सकते हैं तो अपने MainActivity

MyAsyncTask myTask = new MyAsyncTask(this); //can pass other variables as needed 
myTask.execute(); 
+0

आपके उत्तर के लिए धन्यवाद, मुझे यह पसंद है, समस्या यह है कि runOnUIThread() को एक स्वतंत्र फ़ाइल होने पर नहीं चलाया जा सकता है, मुझे इसे एक आंतरिक कक्षा का उपयोग करना होगा, जिसे मैं नहीं चाहता क्योंकि मैं इसका उपयोग कर रहा हूं 3 गतिविधियों के लिए कक्षा, और मैं प्रत्येक गतिविधि में AsyncTask के कोड का पूरा टुकड़ा नहीं डाल रहा हूं – Alex

+0

आपको आंतरिक कक्षा का उपयोग करने की आवश्यकता नहीं है। कन्स्ट्रक्टर में पैरामीटर के रूप में गतिविधि के संदर्भ को पास करें (जैसे कोडमैजिक वर्णन कर रहा है)। फिर runOnUIThread() विधि – Sababado

+1

पर कॉल करने के लिए गतिविधि के संदर्भ का उपयोग करें धन्यवाद, यह पोस्टपोस्टएक्सक्यूट() पर काम करता है! – Alex

2

मैं सबसे ट्यूटोरियल वे कुछ भी चुन सकते समझने के लिए/पढ़ सबसे आसान है में विश्वास करते हैं में यह कहते हैं, वास्तव में सबसे अच्छा क्या नहीं है।

एक आंतरिक कक्षा के साथ, आप उपलब्ध गतिविधि के अपने चर रखते हैं, जो आसान हो सकता है।

सामान्य रूप से, आपको जितना संभव हो सके, अपने AsyncTasks को भी समाहित करना चाहिए, ताकि आप उन्हें अपने कोड के किसी भी अन्य बिंदु से पुनः उपयोग कर सकें।

+0

हां यही कारण है कि मैं इसके लिए एक स्वतंत्र फ़ाइल बनाना चाहता हूं ताकि मैं न केवल एक उद्देश्य के लिए इसका उपयोग कर सकूं बल्कि कई उद्देश्यों के लिए भी – Alex

2

हां आप अपने MainActivity.java में AsyncTask class बना सकते हैं।

public class CategoryListScreen extends Activity { 


    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
    new loadcategory().execute(); 
} 
class loadcategory extends AsyncTask<Void, Void, Void> { 

@Override 
     protected Void doInBackground(Void... params) { } 

protected void onPostExecute(Void param) { } 
    } // AsyncTask over 
}//main class over 
+0

बात यह है कि मैं इसे उपयोग नहीं करना चाहता एक आंतरिक वर्ग मैं इसे एक अलग वर्ग के रूप में उपयोग करना चाहता हूं। – Alex

4

आम तौर पर हम एक ही कक्षा में AsyncTask जगह बनाने के लिए इसे और अधिक स्पष्ट है कि यह केवल एक ही गतिविधि द्वारा प्रयोग किया जाता है।

यदि आप चाहते हैं कि AsyncTask टोबे से एक से अधिक गतिविधि के द्वारा पुन: उपयोग किया, तो आप बस एक स्वतंत्र वर्ग बना सकते हैं और निर्माताओं द्वारा गतिविधि से पैरामीटर पारित कर सकते हैं

आप अपने asyncTask को asynctask से प्रतिक्रिया भेजने के लिए इंटरफ़ेस बना सकते हैं आपकी गतिविधि नीचे की तरह है और जब भी आवश्यक हो, आपको लिस्टर विधि कॉल करें।मैं इसे onPostExecute() कहा जाता है:

public class DeckDownloader extends AsyncTask<Void, Void, String> { 

    OnDownloadUpdateListener listener; 

    public interface OnDownloadUpdateListener { 
     public void OnDownloadDeckFinish(String Response);  
    } 


    public DeckDownloader(Context ctx, OnDownloadUpdateListener listener) { 
     mContext = ctx; 
     this.listener = listener; 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     String str = "downloading"; 
     //your async code goes here 
     return str; 
    } 

    @Override 
    protected void onPreExecute() { 
      super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
      if(listener != null) { 
       listener.OnDownloadDeckProgress(result); 
      } 
    } 
} 

और आपके गतिविधि कक्षा में, आपको लगता है कि श्रोता को लागू करने और है कि कार्यान्वयन विधि में TextView अद्यतन करने के लिए अपने कोड लिखने की जरूरत है:

public class myActivity extends Activity{ 
      private DeckDownloader.OnDownloadUpdateListener downloadListener; 
      TextView txtAsyncResponse; 

      @Override 
      public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       txtAsyncResponse = (TextView) findViewById(R.id.txtAsyncResponse); 


      downloadListener = new DeckDownloader.OnDownloadUpdateListener() { 
       @Override 
       public void OnDownloadDeckFinish(String Response) { 
        txtAsyncResponse.setText(Response); 
       } 
      }; 
    } 

और आप नीचे दिए गए कोड लिख सकते हैं अपनी गतिविधि में AsyncTask शुरू करने के लिए जब भी वरना बटन क्लिक करें घटना की तरह आवश्यक

DeckDownloader mTask = new DeckDownloader(this.getApplicationContext(), downloadListener); 
mTask.execute(); 

यह thindg आप चाहते हो सकता है!

+0

और फिर मैं विचारों को कैसे बदल सकता हूं? मैं RunOnUIThread() को चला नहीं सकता अगर यह एक स्वतंत्र वर्ग है। – Alex

+0

आप runOnUIThread का उपयोग क्यों कर रहे हैं? इसके लिए आपको क्या चाहिए? –

+1

मैंने आपकी टिप्पणी को प्रश्न में पढ़ा है कि आपको टेक्स्टव्यू सामग्री को बदलने की आवश्यकता है taht AsyncTask को पूरा करने के बाद कॉलर गतिविधि में है? क्या मेरी समझ सही है? –

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