2011-10-21 13 views
6

Czy jest możliwe, aby Runnable mógł zwrócić wartość? Muszę wykonać intensywną pracę nad Edytowalną, a następnie ją zwrócić. Oto mój fałszywy kod.Czy Runnable może zwrócić wartość?

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; 
} 
... 
} 

Tak oczywiście mój pierwszy problem jest usiłuję zmienić finalEdit, ale to musi być ostateczny, aby uzyskać do niego dostęp i wyjść z gwintem, prawda? Jaki jest właściwy sposób na zrobienie tego?

+2

'Runnable' nie może jednak' Callable' możliwe. Użyj z 'Executorem'. –

+0

Dzięki Denis, to brzmi jak powinno – bwoogie

Odpowiedz

2

W Javie Runnable nie może "zwrócić" wartości.

W szczególności w systemie Android najlepszym sposobem na obsłużenie scenariusza jest AsyncTask. Jest to klasa ogólna, więc możesz określić typ, który chcesz przekazać i typ zwracany do funkcji onPostExecute.

W twoim przypadku utworzysz AsyncTask<Editable, Void, TypeToReturn>. Coś jak:

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

Poniższy przykład mówi o używaniu "pseudo-zamknięć" w Javie, jako nieodpowiednich, ponieważ mogą być w tym przypadku.


Java umożliwia pseudo-zamknięcia poprzez typy zmienne przechowywane w zmiennych końcowych.

Przejdź do sekcji "Fałszowanie", patrz: Java's pseudo-closures by Christopher Martin. Wprowadza on kodowanie typu zmiennego typu:

2

Zdajesz sobie sprawę, że wątek działa dalej po zakończeniu funkcji workOnEditable(), prawda? Jeśli chcesz uzyskać synchroniczną odpowiedź, pozbądź się wątku. Jeśli nie, użyj Handler'a, aby przekazać dane z powrotem do głównego wątku.

Powiązane problemy