我终于设法通过接口/监听器(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无法分配,因为它是在封闭类型中定义的”错误出现了。我怎么能绕过这个?
由于
答案 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#中一样。
修改强>
答案 1 :(得分:0)
使用值持有者,它基本上是一个在字段中存储某些值的对象。可以将值持有者指定为final,但您可以更改该值。请点击此链接获取有关此模式的更多信息:http://martinfowler.com/eaaCatalog/lazyLoad.html
但是你可以使用你的字符串作为值持有者:只需附加到分配给out的空字符串。或者更好地使用StringBuffer对象。