2011-10-21 11 views
6

È possibile che un Runnable restituisca un valore? Ho bisogno di fare un po 'di lavoro intensivo su un modificabile e poi restituirlo. Ecco il mio codice simulato.Un Runnable può restituire un valore?

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

Così, ovviamente, il mio primo problema è che sto cercando di cambiare finalEdit, ma deve essere definitiva al fine di accedere dentro e fuori del filo, giusto? Qual è il modo corretto per farlo?

+2

'Runnable' non può non' Callable' può. Utilizzare con un 'esecutore'. –

+0

Grazie denis, sembra che dovrebbe funzionare – bwoogie

risposta

2

In Java, un Runnable non può "restituire" un valore.

In Android, in particolare, il modo migliore per gestire il tipo di scenario è con AsyncTask. È una classe generica, quindi è possibile specificare il tipo che si desidera passare e il tipo restituito alla funzione onPostExecute.

Nel tuo caso, devi creare un AsyncTask<Editable, Void, TypeToReturn>. Qualcosa di simile:

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

Quanto segue esiste semplicemente per indicare l'uso di "pseudo-chiusure" in Java, come non idoneo come potrebbero essere in questo caso.


Java consente pseudo-chiusure tramite tipi mutabili memorizzati nelle variabili finali.

Vedere Java's pseudo-closures by Christopher Martin passare alla sezione "Fake it". Egli introduce un mutabile di tipo ValueHolder<T>:

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

Felice di codifica.

2

Ti rendi conto che il thread continua a funzionare oltre la fine della funzione workOnEditable(), giusto? Se vuoi una risposta sincrona, elimina la discussione. In caso contrario, utilizzare un gestore per passare i dati al thread principale.

Problemi correlati