如何传递或分配在runOnUiThread中获取的值

时间:2013-01-01 21:01:27

标签: java android runnable anonymous-class

在WebView的子类中,我在getTitle()的重写方法中有这个:

      @Override
      public String getTitle() {
        Activity a = getVoTts().getActivity();
        a.runOnUiThread(new Runnable() {
            public void run() { 
                String tit = VoWebView.super.getTitle();
            }
        });


       String title = tit;  // this is what I WANT to do, it won't compile of course
       ...
       ...
      }

但字符串tit在一个匿名的Runnable类中关闭,因此当然无法在该方法中访问。

是否有任何技术或“技巧”允许我将匿名Runnable类中获得的值传递给行中的语句(在同一方法中)或将其分配给数据成员?

4 个答案:

答案 0 :(得分:4)

一种方法是声明一个实例字段并在整个类中使用它。例如:

private String someText;

// ...

@Override
public String getTitle()
{
    Activity a = getVoTts().getActivity();
    a.runOnUiThread(new Runnable()
    {
        public void run()
        {  
            someText = VoWebView.super.getTitle();
        }
    });
}

修改

关于为什么必须将局部变量声明为final(或者换句话说,编译时间常量)的原因:

想象一下,以下内容在Java中有效:

@Override
public String getTitle()
{
    Foo f = new Foo();

    Button b = getButtonReference();
    b.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {  
            Boo o = f.someMethod();
        }
    });

    f = null;
}

f = null,foo对象将有资格进行垃圾回收。因此,如果单击该按钮,则VM在foo对象上调用someMethod()为时已晚,因为它是垃圾收集的!

答案 1 :(得分:1)

为什么不声明全局变量:

 private String title;

  @Override
  public String getTitle() {
    Activity a = getVoTts().getActivity();
    a.runOnUiThread(new Runnable() {
        public void run() { 
            title = VoWebView.super.getTitle();
        }
    });
  }

答案 2 :(得分:1)

您可以按如下方式使用FutureTask

FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Compute your string
    }
});

runOnUiThread(task);
String title = task.get();

答案 3 :(得分:0)

<强>更新

根据评论,.runOnUiThread()异步运行其runnable,这意味着当我们到达“线下的语句”时,任务可能会或可能不会运行。那么就不可能在方法的其余部分中将结果传递给那些语句(这里没有任何解决方案可以帮助你)。