在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类中获得的值传递给行中的语句(在同一方法中)或将其分配给数据成员?
答案 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,这意味着当我们到达“线下的语句”时,任务可能会或可能不会运行。那么就不可能在方法的其余部分中将结果传递给那些语句(这里没有任何解决方案可以帮助你)。