2011-10-21 16 views
6

¿Es posible que un Runnable devuelva un valor? Necesito hacer un trabajo intensivo en un Editable y luego devolverlo. Aquí está mi código simulado.¿Puede un Runnable devolver un valor?

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

Así que, obviamente, mi primer problema es que estoy tratando de cambiar finalEdit, pero tiene que ser definitiva con el fin de acceder a él dentro y fuera de la rosca, ¿verdad? ¿Cuál es la forma correcta de hacer esto?

+2

'Runnable' no puede sino' Callable' pueda. Usar con un 'Ejecutor'. –

+0

Gracias Denis, eso suena como que debería funcionar – bwoogie

Respuesta

2

En Java, un Runnable no puede "devolver" un valor.

En Android específicamente, la mejor manera de manejar su tipo de escenario es con AsyncTask. Es una clase genérica, por lo que puede especificar el tipo que desea pasar y el tipo que se devuelve a la función onPostExecute.

En su caso, crearía un AsyncTask<Editable, Void, TypeToReturn>. Algo así como:

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

Lo siguiente existe simplemente para señalar el uso de "pseudocierre" en Java, como inadecuado, ya que pueden ser en este caso.


Java permite pseudo-cierres a través de tipos mutables almacenados en variables finales.

Consulte Java's pseudo-closures by Christopher Martin omita la sección "Falsificarlo". Se introduce un tipo mutable ValueHolder<T>:

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

feliz de codificación.

2

Te das cuenta de que el hilo sigue funcionando más allá del final de la función workOnEditable(), ¿verdad? Si quieres una respuesta sincrónica, deshacerte del hilo. De lo contrario, utilice un controlador para volver a pasar los datos al hilo principal.

Cuestiones relacionadas