2011-03-23 15 views
9

से टेक्स्ट व्यू अपडेट करें मेरी ऑनक्रेट विधि में मैंने एक थ्रेड बनाया है जो आने वाले संदेश को सुनता है!थ्रेड

In OnCreate() { 

//Some code 

myThread = new Thread() { 

      @Override 

      public void run() { 

       receiveMyMessages(); 

      } 
     }; 
myThread.start(); 

// Some code related to sending out by pressing button etc. 

} 

Then, receiveMyMessage() functions… 

Public void receiveMyMessage() 
{ 

//Receive the message and put it in String str; 

str = receivedAllTheMessage(); 

// << here I want to be able to update this str to a textView. But, How? 
} 

मैं this article जाँच की है, लेकिन यह मेरे लिए काम नहीं किया, कोई किस्मत!

उत्तर

19

एंड्रॉइड एप्लिकेशन में यूआई के लिए कोई भी अपडेट UI थ्रेड में होना चाहिए। यदि आप पृष्ठभूमि में काम करने के लिए धागे को जन्म देते हैं तो आपको दृश्य को स्पर्श करने से पहले परिणामों को यूआई थ्रेड पर वापस मार्शल करना होगा।

public class TestActivity extends Activity { 
    // Handler gets created on the UI-thread 
    private Handler mHandler = new Handler(); 

    // This gets executed in a non-UI thread: 
    public void receiveMyMessage() { 
     final String str = receivedAllTheMessage(); 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       // This gets executed on the UI thread so it can safely modify Views 
       mTextView.setText(str); 
      } 
     }); 
} 

AsyncTask वर्ग आप के लिए विवरण का एक बहुत सरल और भी कुछ आप पर गौर कर सकता है: आप marshaling प्रदर्शन करने के लिए Handler वर्ग का उपयोग कर सकते हैं। उदाहरण के लिए, मेरा मानना ​​है कि यह आपको थ्रेड पूल प्रदान करता है ताकि प्रत्येक बार जब आप पृष्ठभूमि कार्य करना चाहते हैं तो एक नया धागा फैलाने से जुड़ी कुछ लागतों को कम करने में मदद करें।

+0

हैलो सभी,, धन्यवाद आपके समय के लिए बहुत बहुत धन्यवाद। फिर भी कोई भाग्य नहीं! मैं अपने प्रश्न को दोबारा लिखने की कोशिश कर रहा हूं: - (मूल प्रश्न के साथ) ऑनक्रेट में प्राप्त मैममेज() को थ्रेड में कहा जाता है! इसका मतलब यह है कि MyMessage एक अलग धागे में है। इस धागे में, मेरे पास थोड़ी देर लूप है, अगर कोई संदेश है तो पढ़ रहा है! सार्वजनिक शून्य receiveMessages() { जबकि पाश (स्थिति) { str = receivedAllTheMessage(); // अब, यहाँ मैं tv.settext जीयूआई तत्वों को अपडेट करने के लिए ... चाहते हैं आदि .. } } –

+1

इस जवाब पर ** अतिरिक्त टिप: ** आप का उपयोग करके गतिविधि के अलग हैंडलर बनाने को छोड़ सकते हैं हैंडलर ऑब्जेक्ट। 'हैंडलर = getWindow()। getDecorView()। getHandler(); ' – Kent

+0

@ किंट यह टिप काम कर सकती है या नहीं, आप इसका उपयोग कहां कर सकते हैं। मैंने पाया कि इंटरनेट पर कहीं और टिप, और इसका उपयोग किया, और फिर जब मैंने अपने कार्यक्रम में कुछ चीजें बदल दीं तो अचानक यह काम नहीं कर सका। अधिक जानकारी के लिए यहां देखें: http://codereview.stackexchange.com/a/114723/92925 – RenniePet

0

एंड्रॉइड हैंडलर का उपयोग करके संदेश-पासिंग समवर्तीता का समर्थन करता है और संदेश भेजता है (संदेश)। (साझा-स्मृति समरूपता के लिए हैंडलर का उपयोग करना भी संभव है।) एक टिप थ्रेड.सेटडेमॉन (सत्य) को कॉल करना है यदि आप चाहते हैं कि ऐप मरने पर थ्रेड मर जाए। दूसरी बात यह है कि संदेशों को रूट करने के लिए संदेश हैंडलर में केवल एक हैंडलर और संदेश का उपयोग करें।

Code और Code

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