2011-10-10 16 views
6

मेरा एप्लिकेशन इंटरनेट से कुछ एचटीएमएल कोड प्राप्त करता है और जब किया जाता है, तो इसे डिवाइस स्क्रीन पर प्रदर्शित करता है। चूंकि ऐसा करने में लगभग 3-4 सेकंड लगते हैं, इस समय स्क्रीन काला रहता है, मैं एक प्रगति संवाद का उपयोग करना चाहता हूं। यह मेरा कोड है:एंड्रॉइड प्रगति संवाद

package com.nextlogic.golfnews; 



// ALL THE IMPORTS .... 

public class Activity1 extends Activity { 

    private ProgressDialog progressDialog; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main2); 

     progressDialog = ProgressDialog.show(Activity1.this, "", "Loading..."); 
     new Thread() 
     { 
      public void run() 
      { 

      try 
       { 
       sleep(2000); 

      // HERE I'VE PUT ALL THE FUNCTIONS THAT WORK FOR ME 
} 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

प्रोग्राम काम करता है लेकिन यह अब और कुछ प्रदर्शित नहीं करता है। मुझे लॉगकैट में एक त्रुटि है:

Only the original thread that created a view hierarchy can touch its views. 

क्या आप कृपया मेरी मदद कर सकते हैं? अग्रिम में धन्यवाद।

+0

दिए गए उत्तर सही हैं, लेकिन मैं कुछ जोड़ना चाहता हूं। प्रोग्रेसडियलॉग में 2 शैलियों हैं: STYLE_SPINNER (डिफ़ॉल्ट) और STYLE_HORIZONTAL। [Ui संवाद] के अनुसार (http://developer.android.com/guide/topics/ui/dialogs.html) हमें [प्रगति और गतिविधि के लिए डिजाइन दिशानिर्देश] का पालन करना चाहिए (http://developer.android.com /design/building-blocks/progress.html) और एक STYLE_HORIZONTAL (यदि प्रासंगिक और संभव हो) का उपयोग करें। इस मामले पर मैंने पाया [यह ट्यूटोरियल] (http://www.pavanh.com/2013/04/android-progress-dialog-example.html) बहुत उपयोगी है। अब आपके पास पसंद है प्रगति डियालॉग की शैली जो आप चाहते हैं ... –

उत्तर

17

त्रुटि पर्याप्त व्याख्यात्मक है। एक दृश्य वस्तु को अद्यतन करने के लिए आपको मुख्य थ्रेड के अंदर परिवर्तनों को चलाना होगा। एक त्वरित और गंदा फिक्स runOnUiThread() के अंदर अद्यतन कोड को कॉल कर सकता है।

हालांकि आपके मामले में मैं प्रगति पट्टी की प्रगति को डाउनलोड और अपडेट करने के लिए AsyncTask का उपयोग करूंगा। जब कार्य समाप्त होता है तो कार्य में यूआई थ्रेड पर चलने की संपत्ति होती है (ताकि आप प्रगति संवाद को खारिज कर सकते हैं, जैसे कि प्रगति संवाद को खारिज कर सकते हैं)

Here एक उदाहरण है कि एक डाउनलोड प्रगति संवाद प्रदर्शित करने के लिए AsyncTask का उपयोग कैसे करें।

अद्यतन

Stackoverflow पहले से ही अपने सभी सवाल का जवाब है। Here कुछ सामग्री डाउनलोड करने और डाउनलोड प्रगति प्रदर्शित करने के लिए AsyncTask का एक उदाहरण है। बस आप क्या चाहते हैं।

अद्यतन 2

यहाँ ठीक है अपने कोड एक AsyncTask उपयोग कर रहा है:

public class Activity1 extends Activity 
{ 
    private ProgressDialog progressDialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     new AsyncTask<Integer, Integer, Boolean>() 
     { 
      ProgressDialog progressDialog; 

      @Override 
      protected void onPreExecute() 
      { 
       /* 
       * This is executed on UI thread before doInBackground(). It is 
       * the perfect place to show the progress dialog. 
       */ 
       progressDialog = ProgressDialog.show(Activity1.this, "", 
         "Loading..."); 
      } 

      @Override 
      protected Boolean doInBackground(Integer... params) 
      { 
       if (params == null) 
       { 
        return false; 
       } 
       try 
       { 
        /* 
        * This is run on a background thread, so we can sleep here 
        * or do whatever we want without blocking UI thread. A more 
        * advanced use would download chunks of fixed size and call 
        * publishProgress(); 
        */ 
        Thread.sleep(params[0]); 
        // HERE I'VE PUT ALL THE FUNCTIONS THAT WORK FOR ME 
       } 
       catch (Exception e) 
       { 
        Log.e("tag", e.getMessage()); 
        /* 
        * The task failed 
        */ 
        return false; 
       } 

       /* 
       * The task succeeded 
       */ 
       return true; 
      } 

      @Override 
      protected void onPostExecute(Boolean result) 
      { 
       progressDialog.dismiss(); 
       /* 
       * Update here your view objects with content from download. It 
       * is save to dismiss dialogs, update views, etc., since we are 
       * working on UI thread. 
       */ 
       AlertDialog.Builder b = new AlertDialog.Builder(Activity1.this); 
       b.setTitle(android.R.string.dialog_alert_title); 
       if (result) 
       { 
        b.setMessage("Download succeeded"); 
       } 
       else 
       { 
        b.setMessage("Download failed"); 
       } 
       b.setPositiveButton(getString(android.R.string.ok), 
         new DialogInterface.OnClickListener() 
         { 

          @Override 
          public void onClick(DialogInterface dlg, int arg1) 
          { 
           dlg.dismiss(); 
          } 
         }); 
       b.create().show(); 
      } 
     }.execute(2000); 

     new Thread() 
     { 
      @Override 
      public void run() 
      { 

       // dismiss the progressdialog 
       progressDialog.dismiss(); 
      } 
     }.start(); 
    } 
} 
+0

क्या आप कृपया मेरी सहायता कर सकते हैं? मैं एंड्रॉइड के लिए नया हूं और मैंने उस उदाहरण को पूरी तरह से समझ नहीं लिया। – Teo

+0

अद्यतन –

+0

पर एक नज़र डालें यह बात है .. मैं अपने कार्यों को बदलना नहीं चाहता क्योंकि प्रोग्राम ठीक काम करता है, थोड़ा धीमा। मैं उन कार्यों को पृष्ठभूमि धागे में रखना चाहता हूं और जब वे कार्य निष्पादित कर रहे हैं, तो मैं प्रगति संवाद प्रदर्शित करना चाहता हूं। – Teo

1

नेटवर्क आपरेशन पूरा

runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
      progressDialog.dismiss(); 

      } 
     }); 
4

के बाद एक यूआई धागा बनाएं आप इस तरह से करने की जरूरत है

runOnUiThread(new Runnable() { 
    public void run() { 
     // Do Your Stuff 
    }}); 
+0

और मैं प्रगतिDialog कहां खारिज करूँ? – Teo

+0

मुझे लगता है कि आप उपरोक्त कोड लिखने में एक फ़ंक्शन बनाते हैं और टिप्पणी के स्थान पर संवाद को खारिज करने के लिए कोड लिखते हैं और जब भी आपको – MKJParekh

2

इस तरह अपने डायलॉग को रद्द:

Handler handler = new Handler(); 
handler.post(new Runnable(){ 
    public void run(){ 
     progressDialog.dismiss(); 
    } 
}); 
+0

की आवश्यकता होती है तो मज़े को कॉल करें, मैंने आपके कोड के साथ 'progressDialog.dismiss();' को बदल दिया है। अब कार्यक्रम दुर्घटनाग्रस्त हो गया है। – Teo

+0

इस लाइन को हैंडलर हैंडलर = नया हैंडलर(); धागे से बाहर .... –

+0

मैंने यह किया, प्रोग्राम दुर्घटनाग्रस्त हो गया .. firs यह कहता है: 'थ्रेड के अंदर हैंडलर नहीं बना सकता है जिसे Looper.prepare()' नहीं कहा जाता है और फिर 'सीमाओं से बाहर स्ट्रिंग' – Teo

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