2011-02-08 4 views
6

मैं प्रगति बार मूल्य, जीयूआई अद्यतन करने के लिए गतिविधि कक्षा में एक थ्रेड से बुलाया वर्ग से भेजा जा रहा है निम्नथ्रेड से गतिविधि तक प्रगति मूल्य कैसे पारित करें?

के रूप में [कोड स्निपेट यह केवल स्पष्टीकरण के लिए है संकलन नहीं है] एक डिजाइन मुद्दा हो रहा है:

Class A : Extend Activity { 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      B objB = new B(); 
      objB.DownloadFile(); 
     } 
    }).start(); 
} 

Class B { 
    public void DownloadFile() 
    { 
     ... some work [preparing SOAP request] 
     while(response.read()) 
     { 
     //send calculated progress to Class A to update the progress value 
     } 

    } 

} 

कोई मदद या मार्गदर्शन किया जाएगा बहुत सराहना

उत्तर

2

आप कक्षा एक में एक updateProgressBar विधि बना सकता है और फिर वर्ग बी वर्ग ए कक्षा बी के लिए एक संदर्भ पारित तो कैलोरी सकता है एल में कॉलबैक फ़ंक्शन (शायद एक int या कुछ को इंगित करने के लिए कि प्रगति कितनी दूर है)। UI को एक अलग थ्रेड से अपडेट करना, फिर यूआई थ्रेड समस्याओं का कारण बनता है। सौभाग्य से गतिविधि वर्ग में "runOnUiThread (रननेबल एक्शन)" विधि है।

while(response.read()){ 
    //do stuff here 
int progress = getProgress(); //set the progress to something 
    a.runOnUiThread(new Runnable(){ 
    a.updateProgress(progress); 
    }); 
} 
+0

मैं के लिए बहुत आभारी हूँ प्रतिक्रिया मैं अभी इसका परीक्षण करने जा रहा हूं और आपको परिणाम जानने देता हूं, ** धन्यवाद **। –

+0

धन्यवाद रटर, पूरी तरह से काम किया। –

+0

इसे सुनकर खुशी हुई। डेव द्वारा पोस्ट किया गया अन्य उत्तरदाता हालांकि एक स्वच्छ समाधान हो सकता है। मुझे अभी हैंडलर क्लास के बारे में पता नहीं था। अंत में मुझे लगता है कि यह लगभग एक ही चीज़ करता है। – Rutger

3

मैं एक Handler का उपयोग किया है इस प्रभाव को प्राप्त करने के लिए: तो प्रगति आप की तरह कुछ कर सकता है स्थापित करने के लिए। Activity में इसे बनाएं, जिसमें आप ProgressDialog बनाते हैं, फिर Handler को उस मेथ में पास करें जिसे आप प्रगति प्राप्त करना चाहते हैं। तो फिर तुम प्रगति अपडेट करने बुला Activity वापस करने के लिए संदेश भेज सकते हैं:

public class ClassA extends Activity { 
    ... 
    private static final int HANDLER_MESSAGE_PERFORM_DIALOG_UPDATE = 0; 
    ... 
    new Thread(new Runnable() 
    { 
     public void run() 
     { 
      B objB = new objB(); 
      objB.DownloadFile(handler); 
     } 
    }).start(); 
    ... 
    private Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      switch(msg.what){ 
      case Constants.HANDLER_MESSAGE_PERFORM_DIALOG_UPDATE: 
       progress.setProgress(msg.arg1); 
       break; 
      default: 
       Log.w("TAG_NAME","handleMessage/Message type not recognised/msg.what = "+String.valueOf(msg.what)); 
      } 
     } 
    }; 
} 

Class B 
{ 
    public void DownloadFile(Handler handler) 
    { 
     ... some work [preparing SOAP request] 
     while(response.read()) 
     { 
     //send calculated progress to Class A to update the progress value 
      sendMessage(handler,HANDLER_MESSAGE_PERFORM_DIALOG_UPDATE,progress); 
     } 
    } 
    private void sendMessage(Handler handler,int what, int arg1){ 
     Message msg = Message.obtain(); 
     msg.what = what; 
     msg.arg1 = arg1; 
     handler.sendMessage(msg); 
    } 
} 
+0

प्रतिक्रिया के लिए धन्यवाद, मैं जितनी जल्दी हो सके इसका परीक्षण कर रहा हूं और देख सकता हूं कि यह 1 उत्तर से अधिक विश्वसनीय है, आप दोनों के लिए धन्यवाद। –

3

मैं हमेशा pattre इस तरह का उपयोग करें और मेरे लिए gr8 काम करता है ...

class A{ 
    new Thread(new Runnable() 
    { 
      public void run() 
      { 
      B objB = new B(new ListnerClass()); 
      objB.DownloadFile(); 
      } 
    }).start(); 

    class ListnerClass implements B.ValueListner{ 
     update(int v){ 
      doWork(); 
     } 
    } 


} 

class B{ 

    ValueListner listner; 

    interface ValuListner{ 
     update(int i); 
    } 
    B(ValueListner listner){ 
     this.listner = listner; 
    } 
    public void DownloadFile() 
     { 
      ... some work [preparing SOAP request] 
     while(response.read()) 
     { 
      listner.update(value); 
     } 

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