在Activity.runOnUiThread()方法之后返回一个值

S.T*_*ane 7 android interface runnable

是否可以在Activity.runOnUiThread()方法后返回一个值.

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        int var = SOMETHING;

        // how to return var value.         
    }
});
Run Code Online (Sandbox Code Playgroud)

在这篇文章中,我看到在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);
        }


    }
Run Code Online (Sandbox Code Playgroud)

zap*_*apl 13

如果你真的想这样做,你可以使用期货,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();
Run Code Online (Sandbox Code Playgroud)

这也适用于抛出的异常call,它们将被重新抛出get(),你可以在调用线程中处理它们

    try {
        int returnValue = futureResult.get();
    } catch (ExecutionException wrappedException) {
        Throwable cause = wrappedException.getCause();
        Log.e("Error", "Call has thrown an exception", cause);
    }
Run Code Online (Sandbox Code Playgroud)