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

时间:2014-01-28 12:55:13

标签: 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.         
    }
});

在此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);
        }


    }

3 个答案:

答案 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?