2012-02-03 33 views
33

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

"आपको इसकी आवश्यकता क्यों है" प्रश्न पूर्व-खाली करने के लिए, मेरे पास एक थ्रेडेड एनीमेशन है जिसे यूआई थ्रेड पर वापस कॉल करना है ताकि यह बताने के लिए कि वास्तव में क्या आकर्षित किया जाए।

उत्तर

67

बस एक वर्ग है कि निर्माता को स्वीकार करता है कि पैरामीटर कर सकते हैं साथ Runnable लागू करता है,

public class MyRunnable implements Runnable { 
    private Data data; 
    public MyRunnable(Data _data) { 
    this.data = _data; 
    } 

    @override 
    public void run() { 
    ... 
    } 
} 

तुम बस पैरामिट्रीकृत निर्माता के साथ Runnable वर्ग का एक उदाहरण बना सकते हैं।

MyRunnable obj = new MyRunnable(data); 
handler.post(obj); 
+2

मुझे यह दृष्टिकोण पसंद है, लेकिन मैं अपने टाइमर थ्रेड के अंदर से इस कक्षा के साथ कैसे संवाद करूं (रननेबल मुख्य यूआई थ्रेड में बाहर है)। क्या मैं सिर्फ सदस्य को सार्वजनिक कर सकता हूं और हैंडलर को रननेबल पास करने से पहले इसे अपने टाइमर थ्रेड में सेट कर सकता हूं? सच होने के लिए बहुत अच्छा लगता है :) –

+0

देर से उत्तर देने के लिए खेद है, मेरे जवाब संपादित करें। –

+0

किसी कारण से मैंने सोचा कि यदि ओबीजी यूआई थ्रेड के अलावा कुछ जगह बनाई गई है, तो जब यह एक दृश्य (मुख्य धागे में) में हेरफेर करने की कोशिश करता है तो ऐप क्रैश हो जाएगा। मैं इसे एक भंवर दे दूंगा, बहुत बहुत धन्यवाद। –

8

वहाँ यह करने के लिए विभिन्न तरीके हैं, लेकिन सबसे आसान निम्नलिखित है:

final int param1 = value1; 
final int param2 = value2; 
... new Runnable() { 
    public void run() { 
     // use param1 and param2 here 
    } 
} 
+0

मुझे लगता है मैं निर्दिष्ट किया जाना चाहिए था कि मैं इस तरह से मेरी कक्षा में वैश्विक पैरामीटर का उपयोग कर से बचना चाहते हैं ... :) धन्यवाद, लेकिन मैं वास्तव में उन तर्कों को पारित करने या किसी अन्य निर्माण का उपयोग करने के लिए एक विधि प्राप्त करने की कोशिश कर रहा हूं जो उन्हें लेता है (यदि रननेबल नहीं है) –

+0

आप उन्हें रननेबल में फ़ील्ड के रूप में स्टोर कर सकते हैं लेकिन यह इसके बारे में है । आप एक कॉल करने योग्य भी इस्तेमाल कर सकते हैं। –

+0

यह एक सिंक्रनाइज़ेशन समस्या में भागने जा रहा है जब पहली पोस्ट को रननेबल द्वारा पहली पोस्ट से पहले कॉल किया गया है। – marcelnijman

6

आप एक Runnable में जानकारी देने के लिए की जरूरत है, तो आप हमेशा Runnable वस्तु निर्माता में यह जानकारी ले सकते हैं, या कर सकते थे Runnable पर अन्य विधियां हैं जो इसे इस जानकारी को प्राप्त करने की अनुमति देती हैं, या (यदि Runnable एक अज्ञात आंतरिक वर्ग है) उचित मूल्य final घोषित कर सकता है ताकि Runnable उन तक पहुंच सके।

आशा है कि इससे मदद मिलती है!

+0

क्या कॉल करने योग्य थ्रेड से चलने के साथ ठीक होगा जो UI थ्रेड नहीं है? इसके साथ शुरू करने का कारण यह है कि यदि आप किसी भी यूआई तत्वों को बदलने जा रहे हैं तो आप एंड्रॉइड में मुख्य थ्रेड पर कॉल नहीं कर सकते हैं। –

+0

@ डॉड्रेडेल- हां, कोई भी धागा कॉल करने योग्य सक्षम होना चाहिए। – templatetypedef

+0

+1 'रननेबल' को विस्तारित करने और 'अंतिम' चर का संदर्भ देने के लिए अज्ञात वर्ग का उपयोग करने के लिए +1, जब तक यह कॉल करने योग्य पैरामीटर स्वीकार करने के लिए केवल एक स्थान –

1

यद्यपि आप इस सवाल का जवाब उपरोक्त में से किसी का उपयोग कर सकते हैं, लेकिन अगर आप सवाल एंड्रॉयड तो आप भी AsyncTask उपयोग कर सकते हैं के बारे में बहुत चिंतित है।

+0

AsyncTask यूआई थ्रेड में दृश्यों का उपयोग कर सकता है (मुझे एहसास है कि यह केवल एंड्रॉइड में प्रासंगिक है)? –

-1

मैं एक पाया एक सरल तरीका लगता है:

public interface MyRunnable extends Runnable { 
    public void run(int data); 
} 

public void someMethod(int n, String s, MyRunnable r) { 
    ... 
    r.run(n); 
    ... 
} 

कॉल:

someMethod(5, "Hello", new MyRunnable() { 

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

    } 

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

    } 
}); 
+0

सिवाय इसके कि 'MyRunnable'' रननेबल 'का विस्तार नहीं करता है, इसलिए आप इसका उपयोग करने में सक्षम नहीं होंगे जहां' रननेबल 'की अपेक्षा की जाती है। – assylias

+0

@assylias यदि आवश्यक हो तो एक इंटरफ़ेस रननेबल हो सकता है। – ilomambo

+0

हां लेकिन यह मुद्दा नहीं है। आम तौर पर आप 'नया थ्रेड (नया MyRunnable() {...}) कहते हैं;', लेकिन वह 'रन()' विधि को कॉल करेगा, न कि 'रन (int डेटा);' विधि। जब तक आपके पास 'रन' विधि नहीं है, तो 'रन (int डेटा)' विधि को कॉल करें, लेकिन फिर आप पैरामीटर कैसे पास करते हैं? एक वास्तविक उदाहरण के साथ अपने प्रस्ताव का उपयोग करने का प्रयास करें और आप समस्याओं को देखेंगे। – assylias

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

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