一个Runnable可以返回一个值吗?

6

一个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,但必须使其成为final才能在线程内外访问,对吗?正确的做法是什么?


2
Runnable 无法,但 Callable 可以。与 Executor 一起使用。 - denis.solonenko
4个回答

2
在Java中,Runnable无法“返回”值。
特别是在Android中,处理您这种情况的最佳方法是使用{{link1: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允许通过存储在final变量中的可变类型来实现伪闭包。
请参见Christopher Martin的Java伪闭包,跳转到“Faking it”部分。他介绍了一个可变类型ValueHolder<T>
private static class ValueHolder<T> {
  T value;
}
...
final ValueHolder<Integer> i = new ValueHolder<Integer>();
...
i.value = 42;

编程愉快。


1
你意识到线程会在 workOnEditable() 函数结束后继续工作,对吗?如果你想要同步响应,就要摆脱线程。如果不需要同步响应,就使用 Handler 将数据传回主线程。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接