2012-12-20 6 views
75

क्या कोई मुझे बता सकता है कि एंड्रॉइड में यूआई थ्रेड पर एक कार्य निष्पादित करने के लिए runOnUiThread() बनाम Looper.getMainLooper()। पोस्ट() के बीच कोई अंतर है ??runOnUiThread बनाम Looper.getMainLooper()। एंड्रॉइड में पोस्ट

केवल एक चीज के बारे में मैं निर्धारित कर सकता हूं कि चूंकि RunOnUiThread एक गैर स्थैतिक गतिविधि विधि है, Looper.getMainLooper()। पोस्ट() अधिक सुविधाजनक है जब आपको उस कक्षा में कुछ कोड करने की आवश्यकता होती है जो नहीं देख पाती गतिविधि (जैसे एक इंटरफ़ेस)।

मैं यूआई थ्रेड पर कुछ निष्पादित करने के बारे में कोई चर्चा नहीं कर रहा हूं, मुझे लगता है कि कुछ चीजें नहीं हो सकती हैं और बहुत सी चीजें नहीं होनी चाहिए, हालांकि कुछ चीजें (जैसे AsyncTask शुरू करना) यूआई थ्रेड से निष्पादित किया जाना चाहिए।

धन्यवाद,
आर

+4

कोई रन नहीं है कि 'runOnUiThread' यह जांच करेगा कि यह पहले से ही UI थ्रेड है और इसे' संदेश ' – zapl

+1

धन्यवाद के रूप में पोस्ट करने के बजाय सीधे अपना कार्य निष्पादित करता है। क्या आप इसे उत्तर में परिवर्तित कर देंगे, तो मैं इसे स्वीकार कर सकता हूं ?? – Rich

+0

इसके अलावा, मैंने यूआई थ्रेड पर कुछ निष्पादित किया जा रहा है या नहीं, यह जांचने के लिए मैंने कुछ कोड पहले से ही लिखा है, ताकि मैन्युअल रूप से शामिल करना बहुत आसान हो। – Rich

उत्तर

149

निम्नलिखित एक ही व्यवहार करने के तरीके पृष्ठभूमि धागे से कहा जाता

के माध्यम से Looper.getMainLooper()

Runnable task = getTask(); 
    new Handler(Looper.getMainLooper()).post(task); 

के माध्यम से Activity#runOnUiThread()

Runnable task = getTask(); 
    runOnUiThread(task); 

केवल dif सम्मेलन जब आप यूआई धागे से ऐसा

public final void runOnUiThread(Runnable action) { 
    if (Thread.currentThread() != mUiThread) { 
     mHandler.post(action); 
    } else { 
     action.run(); 
    } 
} 

के बाद से यदि वर्तमान थ्रेड पहले से ही यूआई धागा है की जाँच करेगी और यह सीधे निष्पादित है। इसे एक संदेश के रूप में पोस्ट करने से निष्पादन में देरी होगी जब तक आप वर्तमान UI-thread विधि से वापस नहीं आते। यह हमेशा संदेश पोस्ट करेंगे तब भी जब यूआई धागे से कहा जाता है -

वहाँ भी यूआई धागा जो View#post(Runnable) होगा पर एक Runnable निष्पादित करने के लिए एक तीसरा रास्ता है। यह उपयोगी है क्योंकि यह सुनिश्चित करेगा कि View ठीक से बनाया गया है और कोड निष्पादित होने से पहले एक लेआउट है।

+2

महान जवाब, धन्यवाद! – Boy

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