在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
...
...
}
但是String
tit
是在匿名Runnable类中关闭的,因此当然不能在该方法下访问。是否有任何技术或“技巧”可以让我将在匿名Runnable类中获得的值传递给语句(使用相同方法)或将其分配给数据成员?
最佳答案
一种方法是声明一个实例字段并在整个类中使用它。例如:
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()
为时已晚,因为它已被垃圾收集!