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

sca*_*moi 4 java android anonymous-class runnable

在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
       ...
       ...
      }
Run Code Online (Sandbox Code Playgroud)

但是String tit是在匿名Runnable类中关闭的,因此当然不能在该方法下访问。

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

Eng*_*uad 5

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

private String someText;

// ...

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

编辑:

关于为什么必须将局部变量声明为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;
}
Run Code Online (Sandbox Code Playgroud)

f = null,foo对象将可以进行垃圾收集。因此,如果单击该按钮,对于VM调用someMethod()foo对象为时已晚,因为它已被垃圾收集!

  • @Augusto如果它是本地字段,那是正确的。 (3认同)