Java 如何传递或分配在runOnUiThread中获得的值
在WebView的一个子类中,我在getTitle()的一个重写方法中有这样的内容: 但是字符串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
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();