2011-10-21 10 views
6

Runnableが値を返すことは可能ですか?編集可能なものについて集中的に作業し、それを元に戻す必要があります。私の模擬コードはここにあります。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

ありがとうございました – bwoogie

答えて

2

Javaでは、Runnableは値を「返す」ことができません。

具体的には、シナリオの種類を処理する最善の方法は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()関数の最後を過ぎても動作していることを認識していますか?同期応答が必要な場合は、スレッドを削除します。そうでない場合は、ハンドラを使用してデータをメインスレッドに戻します。

0

Runnableの周りに2つのユーティリティメソッドを作成して、結果を得るまで実行可能ファイルをブロックしてブロックします。

現在地を見てとることができます。https://github.com/Petrakeas/HVTHandler/

関連する問題