2012-05-13 16 views
9

किसी गतिविधि की ऑनक्रेट() घटना में, मैंने डेटाबेस से उत्पाद डेटा पुनर्प्राप्त करने के लिए एक AsyncTask शुरू कर दिया है। इसे सफलतापूर्वक पूरा करने के बाद, मैं प्रदर्शन को कैसे अपडेट कर सकता हूं?AsyncTask - निष्पादन के बाद, दृश्य को कैसे अपडेट करें?

Metacode:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.venueviewbasic); 
      (..) 
    new GetProductDetails().execute(); 

class GetProductDetails extends AsyncTask<String, String, String> { 

    protected String doInBackground(String... params) { 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       // Check for success tag 
       int success; 
       try { 
        // Building Parameters 
        List<NameValuePair> params = new ArrayList<NameValuePair>(); 
        params.add(new BasicNameValuePair("id", vid)); 
     (.. retrieve and parse data and set new textview contents ..) 

textviews आदि हालांकि अद्यतन नहीं मिलता।

उत्तर

15

आप async तो में पूरी प्रक्रिया के बाद से दृश्य को अपडेट करें आप

protected void onPostExecute(String result) 
    { 
     textView.setText(result); 
    } 
का उपयोग कर सकते हैं

लेकिन यदि आप पृष्ठभूमि प्रक्रिया चलाते समय डेटा अपडेट करना चाहते हैं तो इसका उपयोग करें। पूर्व के लिए ...

protected Long doInBackground(URL... urls) { 
     int count = urls.length; 
     long totalSize = 0; 
     for (int i = 0; i < count; i++) { 
      totalSize += Downloader.downloadFile(urls[i]); 
      publishProgress((int) ((i/(float) count) * 100));<------ 
     } 
     return totalSize; 
    } 

    protected void onProgressUpdate(Integer... progress) { <------- 
     setProgressPercent(progress[0]); 
    } 

और अधिक विस्तार के लिए देख this link आशा यह आप में मदद मिलेगी ...!

+0

बढ़िया, मैं मानता हूं कि कहीं और मेरी लंबी सूचीदृश्य को अपडेट करने के लिए, अब पहले भाग ने चाल की है। धन्यवाद! :) – richey

+0

आप हमेशा @richey का स्वागत करते हैं ... – MAC

+1

अगर मैं 'myTextView.setText (परिणाम) आज़माता हूं तो मुझे 'myTextView हल नहीं किया जा सकता है';'। और यदि मैं UI को लोड करने का प्रयास करता हूं तो मुझे 'विधि findViewById (int) को MyClass' प्रकार के लिए अपरिभाषित किया गया है। –

5

अपने AsyncTask कक्षा में, onPostExecute विधि जोड़ें। यह विधि यूआई थ्रेड पर निष्पादित होती है और किसी यूआई घटक को अपडेट कर सकती है।

 
class GetProductDetails extends AsyncTask<...> 
{ 
    ... 
    private TextView textView; 
    ... 
    protected void onPostExecute(String result) 
    { 
     textView.setText(result); 
    } 
} 

(result पैरामीटर अपने वर्ग के doInBackground विधि से दिए गए मान है।)

+0

बिल्कुल, यह चाल है, धन्यवाद !! मुझे सीधे थ्रेड में बजाए onPostExecute() विधि में डिस्प्ले अपडेट करना होगा। – richey

+0

यदि मैं 'myTextView.setText (परिणाम) आज़माता हूं, तो मुझे' myTextView हल नहीं किया जा सकता है '; और यदि मैं UI को लोड करने का प्रयास करता हूं तो मुझे 'विधि findViewById (int) को MyClass' प्रकार के लिए अपरिभाषित किया गया है। –

+0

क्या आपको अपना उत्तर @ फ्रांसिस्को कोरलसमोराल्स मिला। मुझे एक ही समस्या मिल रही है – Yasha

7

मुझे लगता है कि यूआईआई को पकड़ने के तरीके के बारे में सवाल यह है कि asyncTask एक अलग फ़ाइल में है या नहीं।

उस स्थिति में आपको संदर्भ को Async कार्य में पास करना होगा और दृश्य प्राप्त करने के लिए इसका उपयोग करना होगा।

class MyAsyncTask extends AsyncTask<URL, Integer, Long> { 

    Activity mActivity; 

    public MyAsyncTask(Activity activity) { 
     mActivity = ativity; 
    } 

और फिर अपने onPostExecute में उपयोग

int id = mActivity.findViewById(...); 

आप अपनी नहीं यूआई धागा के बाद से "doInBackground" से देखें अद्यतन नहीं कर सकते याद रखें।

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