Runnable可以返回一个值吗?

时间:2011-10-21 02:47:21

标签: android multithreading runnable

Runnable是否可以返回值?我需要对Editable进行一些密集的工作,然后将其返回。这是我的模拟代码。

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,但它必须是最终的才能进入和退出线程,对吧?这样做的正确方法是什么?

4 个答案:

答案 0 :(得分: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 :(得分: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 :(得分:1)

你意识到线程一直在workOnEditable()函数的末尾,对吗?如果你想要一个同步响应,摆脱线程。如果没有,请使用Handler将数据传回主线程。

答案 3 :(得分:0)

我在Runnable周围制作了两个实用工具方法,可以发布一个runnable和block,直到你得到结果。

您可以在此处查看:https://github.com/Petrakeas/HVTHandler/