从内部类/侦听器中获取对象

时间:2012-01-21 10:17:19

标签: android

我终于设法通过接口/监听器(DogListener)从AsyncTask(DogAsyncTask)中获取对象:

public String fout(String url) {

    Dog d_in = new Dog("DogName");
    DogAsyncTask task = new DogAsyncTask(d_in);

    final String out = "";    <---Have tried but error for out becomes "The final local variable out cannot be assigned, since it is defined in an enclosing type"
    task.setDogListener(new DogListener()
    {
        @SuppressWarnings("unchecked")
        @Override
        public void DogSuccessfully(String data) {  <---The string I want to get
            Log.e("DogListened", data);
            out = data;
        }

        @Override
        public void DogFailed() {}
    });

    task.execute(url);
    return out;
}

我的主要活动调用此函数(fout)并且应该从中获取一个String。字符串数据已经存在并且Log.e(“DogListened”,数据);记录它。如何将其向外返回到我的主要活动?我已经尝试设置= data并在外部制作了一个最终字符串,但是“最终局部变量out无法分配,因为它是在封闭类型中定义的”错误出现了。我怎么能绕过这个?

由于

2 个答案:

答案 0 :(得分:1)

我猜您无法访问out,因为它超出了侦听器的范围。您可以将out作为参考参数传递给DogListener的构造函数。

final String out = "";    
task.setDogListener(new DogListener( **out** )
{
    @SuppressWarnings("unchecked")
    @Override
    public void DogSuccessfully(String data) {  
        Log.e("DogListened", data);
        out = data;
    }

    @Override
    public void DogFailed() {}
});

但说实话,我不知道如何在Java中传递参数作为参考,就像在C#中一样。

修改

这也可以帮到你:Can I pass parameters by reference in Java?

答案 1 :(得分:0)

使用值持有者,它基本上是一个在字段中存储某些值的对象。可以将值持有者指定为final,但您可以更改该值。请点击此链接获取有关此模式的更多信息:http://martinfowler.com/eaaCatalog/lazyLoad.html

但是你可以使用你的字符串作为值持有者:只需附加到分配给out的空字符串。或者更好地使用StringBuffer对象。