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

Java 如何传递或分配在runOnUiThread中获得的值,java,android,runnable,anonymous-class,Java,Android,Runnable,Anonymous Class,在WebView的一个子类中,我在getTitle()的一个重写方法中有这样的内容: 但是字符串tit在匿名可运行类中是关闭的,因此当然不能通过该方法访问 是否有任何技术或“技巧”允许我将在匿名可运行类中获得的值传递给下面的语句(使用相同的方法)或将其分配给数据成员?一种方法是声明一个实例字段并在整个类中使用它。例如: private String someText; // ... @Override public String getTitle() { Activity a = g

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

但是字符串
tit
在匿名可运行类中是关闭的,因此当然不能通过该方法访问


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

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

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()
就太晚了,因为它是垃圾收集的

为什么不声明一个全局变量:

 private String title;

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

更新

根据一条评论,
.runOnUiThread()
异步运行其runnable,这意味着当我们到达“语句行”时,任务可能已经运行,也可能没有运行。那么就不可能在方法的其余部分得到这些语句的结果(这里的任何解决方案都不能帮助您做到这一点)。

您可以使用以下方法:

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

runOnUiThread(task);
String title = task.get();
FutureTask task=newfuturetask(newcallable()){
@凌驾
公共字符串调用()引发异常{
//计算你的字符串
}
});
runOnUiThread(任务);
字符串title=task.get();

如果与匿名类共享,我认为java要求字段为final。否。它只要求局部变量是最终变量。但是,它需要返回一个值。也需要向您返回+1。你是对的:它会对局部变量喊“I need final”,但对数据成员却不会喊“I need final”,因为某些奇怪的原因。@scatmoi请参阅关于这一点的详细说明。@Eng.Fouad,以获取相关的解释。现在,如果我只得到一个在重写的getTitle()中本地工作的技巧,那么它将是可重入的。:-)+这是一个非常好的解决方案,在我的特殊情况下确实有效。但这不是重新进入者吗?不需要猜测,因为“rununuithread”是异步执行的。
FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // Compute your string
    }
});

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