是否可以在Activity.runOnUiThread()
方法之后返回值。
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int var = SOMETHING;
// how to return var value.
}
});
在此post中,我发现在Runnable.run()
方法之后无法返回值。但是如何使用(实现)另一个接口并在执行后返回一个值。
希望所有人都清楚。
修改
可以帮助别人。
我使用D @ Zapl的解决方案,并在Callable
类构造函数中传递一个参数,如下所示:
class MyCallable implements Callable<MyObject> {
int param;
public MyCallable (int param) {
// TODO Auto-generated constructor stub
this.param = param;
}
@Override
public MyObject call() throws Exception {
// TODO Auto-generated method stub
return methodReturningMyObject(this.param);
}
}
答案 0 :(得分:11)
如果你真的想这样做,你可以使用期货和Callable
,它大致是Runnable
但具有返回值。
final String param1 = "foobar";
FutureTask<Integer> futureResult = new FutureTask<Integer>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int var = param1.hashCode();
return var;
}
});
runOnUiThread(futureResult);
// this block until the result is calculated!
int returnValue = futureResult.get();
这也适用于call
内引发的异常,它们将从get()
重新抛出,您可以通过
try {
int returnValue = futureResult.get();
} catch (ExecutionException wrappedException) {
Throwable cause = wrappedException.getCause();
Log.e("Error", "Call has thrown an exception", cause);
}
答案 1 :(得分:1)
问题在于您需要处理要传递给final
方法的runOnUiThread()
变量,这意味着您无法在其中修改它们。但是,有一个技巧,您可以在runOnUiThread()
之前声明非原始数据结构,例如在您想要返回String[]
的情况下String
。当然,您需要将其声明为final
完成后,在runOnUiThread()
方法中,只需在yourarray[0]
中指定所需的返回值,这样在您离开方法后就可以访问它了。
----编辑----
示例:
private void my_method() {
final String[] your_array = new String[1];
...
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int var = SOMETHING;
your_array[0] = "Hello!!!";
// how to return var value.
}
});
System.out.println("I've got a message! It says... " + your_array[0]);
}
答案 2 :(得分:1)
您可以使用处理程序发回消息。
检查以下示例 Android: When should I use a Handler() and when should I use a Thread?