2011-10-21 67 views
6

Runnable有可能返回一個值嗎?我需要在Editable上做一些深入的工作,然後將其返回。這是我的模擬代碼。Runnable可以返回一個值嗎?

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'可以。與'Executor'一起使用。 –

+0

謝謝denis,那聽起來像是應該起作用 – bwoogie

回答

2

在Java中,Runnable不能「返回」一個值。

在Android中,處理您類型場景的最佳方法是使用AsyncTask。它是一個泛型類,因此您可以指定要傳入的類型以及返回給onPostExecute函數的類型。

就你而言,你會創建一個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中使用「僞關閉」,如不適合,因爲它們可能在這種情況下。


Java允許通過存儲在最終變量中的可變類型進行僞關閉。

請參閱Java's pseudo-closures by Christopher Martin跳到「僞裝」部分。他介紹了一個可變型ValueHolder<T>

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

編碼愉快。

2

你意識到線程繼續工作在workOnEditable()函數的末尾,對吧?如果你想要一個同步響應,擺脫線程。如果不是,則使用Handler將數據傳遞迴主線程。

相關問題