2013-01-01 29 views
3

获得在web视图的一个子类的值时,我有此在的getTitle()的覆盖方法:如何通过或分配在runOnUiThread

 @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类中获取的值传递给行中的语句(在同一方法中)或将其分配给数据成员?

回答

4

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

private String someText; 

// ... 

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

编辑:

至于为什么你要声明一个局部变量的最终(或其他字,编译时间常数)的原因:

想象一下在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; 
} 

A t,foo对象将有资格进行垃圾回收。因此,如果您单击该按钮,则虚拟机在foo对象上调用someMethod()太迟了,因为它是垃圾收集的!

+0

我认为Java需要的领域,如果它与匿名类共享,以最终决定。 – Augusto

+2

@Augusto这是正确的,如果它是一个本地领域。 –

+0

不需要。它只需要局部变量是最终的。不过,它需要返回一个值。 –

1

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

private String title; 

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

+1的一个很好的解决方法,实际上可以在我的特定情况下工作。但是这不是不可重入吗? – scatmoi

0

更新

根据评论,.runOnUiThread()运行其运行的异步方式,这意味着该任务可能会或可能不会被运行我们到达“声明”的时候了。然后在方法的其余部分中不可能得到这些语句的结果(并且这里没有解决方案可以帮助你)。

+0

不需要猜测,因为“runOnUiThread”是异步执行的。 – Torben

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();