2011-10-21 11 views
6

क्या यह एक मूल्य वापस करने के लिए एक रननेबल के लिए संभव है? मुझे संपादन योग्य पर कुछ गहन काम करने की ज़रूरत है और फिर इसे वापस कर दें। मेरा नकली कोड यहाँ है।क्या एक रननेबल एक मूल्य लौटा सकता है?

public class myEditText extends EditText { 
... 
private Editable workOnEditable() { 
    final Editable finalEdit = getText(); 
    Thread mThread = new Thread(new Runnable() { 
     public void run() { 


       //do work 

       //Set Spannables to finalEdit 

     } 
    }); 
    mThread.start(); 
    return finalEdit; 
} 
... 
} 

तो स्पष्ट रूप से मेरी पहली समस्या मैं finalEdit बदलने के लिए कोशिश कर रहा हूँ है, लेकिन यह, सही में और धागे से बाहर तक पहुँचने के लिए अंतिम हो गया है? ऐसा करने का सही तरीका क्या है?

+2

'Runnable' नहीं कर सकते हैं लेकिन' Callable' कर सकते हैं। 'निष्पादक 'के साथ प्रयोग करें। –

+0

धन्यवाद डेनिस, ऐसा लगता है कि काम करना चाहिए – bwoogie

उत्तर

2

जावा में, एक रननेबल एक मान "वापस" नहीं कर सकता है।

एंड्रॉइड में विशेष रूप से, आपके प्रकार के परिदृश्य को संभालने का सबसे अच्छा तरीका AsyncTask के साथ है। यह एक सामान्य वर्ग है ताकि आप उस प्रकार को निर्दिष्ट कर सकें जिसमें आप पास करना चाहते हैं और उस प्रकार को पोस्ट करें जो PostExecute फ़ंक्शन पर लौटाया गया है।

आपके मामले में, आप AsyncTask<Editable, Void, TypeToReturn> बनाएंगे। कुछ ऐसा:

private class YourAsyncTask extends AsyncTask<Editable, Void, Integer> { 
    protected Long doInBackground(Editable... params) { 
     Editable editable = params[0]; 
     // do stuff with Editable 
     return theResult; 
    } 

    protected void onPostExecute(Integer result) { 
     // here you have the result 
    } 
} 
1

जावा में "छद्म-बंद" के उपयोग को इंगित करने के लिए निम्नलिखित मौजूद है, अनुपयुक्त जैसा कि वे इस मामले में हो सकते हैं।


जावा अंतिम चर में संग्रहीत म्यूटेबल-प्रकारों के माध्यम से छद्म बंद करने की अनुमति देता है।

Java's pseudo-closures by Christopher Martin देखें "इसे पकाना" अनुभाग पर जाएं।

private static class ValueHolder<T> { 
    T value; 
} 
... 
final ValueHolder<Integer> i = new ValueHolder<Integer>(); 
... 
i.value = 42; 

मुबारक कोडिंग: वह एक परिवर्तनशील प्रकार ValueHolder<T> परिचय देता है।

2

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

0

मैंने रननेबल के आस-पास 2 उपयोगिता विधियां बनाई हैं जो आपको परिणाम प्राप्त होने तक एक रननेबल और ब्लॉक पोस्ट करने में सक्षम बनाती हैं।

आप एक नज़र यहाँ ले जा सकते हैं: https://github.com/Petrakeas/HVTHandler/

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