2012-08-10 19 views
12

मेरे एंड्रॉइड ऐप में, मैं क्लाउड से एक छवि डाउनलोड करता हूं। डाउनलोड थ्रेड में किया जाता है और उसी थ्रेड में मैंने नई डाउनलोड की गई छवि के साथ एक छवि दृश्य भी सेट किया है। छवि सेट करने के बाद, मैं postinvalidate() पर कॉल करता हूं।छवि दृश्य को तुरंत रीफ्रेश कैसे करें

हालांकि छवि तुरंत दिखाई नहीं देती है। क्या रेड्रो तुरंत होने का कोई तरीका है? मुझे एक ड्राइंग चक्र ट्रिगर करने का एक तरीका चाहिए।

उत्तर

38

प्रत्येक वर्ग जो दृश्य वर्ग से ली गई है invalidate() और postInvalidate() विधि है के दौरान तुरंत और न दोबारा बनाई जा सके। यदि invalidate() कहलाता है तो यह सिस्टम को बताता है कि वर्तमान दृश्य बदल गया है और इसे जितनी जल्दी हो सके को फिर से खींचा जाना चाहिए। इस पद्धति केवल अपने UIThread से कहा जा सकता है के रूप में एक और तरीका है जब आप UIThread में नहीं हैं और अभी भी प्रणाली है कि अपने दृश्य बदल दिया गया है सूचित करना चाहते हैं के लिए आवश्यक है। postInvalidate() विधि गैर-यूआईटीएचडी से सिस्टम को सूचित करती है और दृश्य को में अगले ईवेंटलोप में जल्द से जल्द UIThread पर फिर से खींचा जाता है।

अपने मामले में आप AsyncTask (एक बुद्धिमान बैकग्राउंड थ्रेड) की मदद से जो चाहते हैं उसे प्राप्त कर सकते हैं .सिनकटास्क यूआई थ्रेड के उचित और आसान उपयोग को सक्षम बनाता है। यह वर्ग थ्रेड और/या हैंडलर में हेरफेर किए बिना यूआई थ्रेड पर बैकग्राउंड ऑपरेशंस (आपके मामले में पृष्ठभूमि में छवि डाउनलोड करने) की अनुमति देता है और परिणाम प्रकाशित करता है (अपने बिटवैप को अपने इमेज व्यू पर सेट करें)।

एक असीमित कार्य को एक गणना द्वारा परिभाषित किया जाता है जो पृष्ठभूमि धागे पर चलता है और जिसका परिणाम UI थ्रेड पर प्रकाशित होता है। एक अतुल्यकालिक कार्य 3 जेनेरिक प्रकार, पैराम्स, प्रगति और परिणाम कहा जाता है, और 4 चरण, जिसे प्रारंभ, डिनबैकग्राउंड, प्रक्रिया प्रगति और अंत कहा जाता है, द्वारा परिभाषित किया गया है।

4 कदम

जब एक अतुल्यकालिक कार्य निष्पादित किया जाता है, कार्य 4 चरणों के माध्यम से चला जाता है:

onPreExecute(), यूआई धागा तुरंत बाद कार्य निष्पादित किया जाता है पर लागू। यह चरण सामान्य रूप से कार्य को सेट करने के लिए उपयोग किया जाता है, उदाहरण के लिए क्लाउड से छवि डाउनलोड करने से पहले उपयोगकर्ता इंटरफ़ेस में प्रगति पट्टी दिखाकर और इसका उपयोग अच्छा उपयोगकर्ता अनुभव प्रदान करने के लिए किया जाता है।

doInBackground(Params...), PreExecute() निष्पादन समाप्त होने के तुरंत बाद पृष्ठभूमि थ्रेड पर लगाया गया। इस चरण का उपयोग पृष्ठभूमि गणना करने के लिए किया जाता है जिसमें काफी समय लग सकता है। एसिंक्रोनस कार्य के पैरामीटर इस चरण में पास किए जाते हैं। गणना के परिणाम को इस चरण से वापस किया जाना चाहिए और अंतिम चरण में वापस भेज दिया जाएगा। प्रगति की एक या एक से अधिक इकाइयों को प्रकाशित करने के लिए यह चरण प्रकाशन प्रगति (प्रगति ...) का भी उपयोग कर सकता है। इन मानों को UI थ्रेड पर प्रकाशित किया गया है, ऑन प्रोग्रेसअपडेट (प्रगति ...) चरण में।

onProgressUpdate(Progress...), publishProgress(Progress...) पर कॉल के बाद यूआई थ्रेड पर लगाया गया। निष्पादन का समय अपरिभाषित है। पृष्ठभूमि पद्धति अभी भी निष्पादित होने पर इस विधि का उपयोग उपयोगकर्ता इंटरफ़ेस में किसी भी प्रकार की प्रगति को प्रदर्शित करने के लिए किया जाता है।

onPostExecute(Result), पृष्ठभूमि गणना समाप्त होने के बाद यूआई थ्रेड पर लगाया गया। पृष्ठभूमि गणना का परिणाम इस विधि में पैरामीटर के रूप में इस चरण में पारित किया गया है, आप अपनी छवि में बिटमैप सेट कर सकते हैं और अपने विचारों को अमान्य कर सकते हैं

+4

पवित्र गाय, यहां एक +1 है – Korcholis

2

क्या आपने invalidate() का उपयोग करने का प्रयास किया था? यह बलों दृश्य अगले चक्र

+0

लेकिन इस ui धागा हालांकि ... – user1583075

+0

मैं अभी प्रयास नहीं किया है नहीं है, लेकिन ऐसा लगता है आप 'onPostExecute() 'में ऐसा कर सकते हैं। एक संदर्भ देखें [यहां] (http://stackoverflow.com/questions/3960886/problem-with-calling-invalidate-in-async-task-thread-in-android) – Korcholis

+0

ओह, अब मैं आपकी समस्या देखता हूं। मैं हर समय 'AsyncTask' का उपयोग कर रहा था की उम्मीद कर रहा था। मेरी गलती, क्षमा करें – Korcholis

0
new Thread(new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       while (!socket.isClosed()) { 
        imgArray = receiveImagebytes(); 
       } 
      } 
     }).start(); 

     try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


while (!socket.isClosed()) { 
      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 

        imageView.setImageBitmap(BitmapFactory.decodeByteArray(imgArray, 0, imgArray.length)); 
        imageView.invalidate(); 
       } 
      }); 
2

अमान्य कार्य काम नहीं करता है। उरी या यूआरएल या छवि का पथ अस्थायी रूप से बदलना और आवश्यक पथ कार्यों में बदलना। उदाहरण के लिए, अगर मेरे पास है

image_url="myhost/img.png"; 
himg.setImageUrl(image_url, imageLoader); 

मैं के रूप में इस ताज़ा कर सकते हैं:

himg.setImageUrl(null, imageLoader); 
himg.setImageUrl(image_url, imageLoader) 
संबंधित मुद्दे