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