请原谅我的法语英语!
所以,我的Android代码有问题... 我调用一个方法,它返回一个自定义对象的arrayList ...但是这个arrayList是异步加载并在监听器中返回。
你知道如何在调用我的监听器的方法时返回数据吗?
这是我的代码:
public static ArrayList<Advert> getAdverts(Context context) {
// Initialize
RestHelper restHelper = new RestHelper();
// Set the listener
restHelper.setOnRestListener(new OnRestListener<Advert>() {
@Override
public void onDataAvailable(ArrayList<Advert> result) {
// -- Datas are loaded : now we must return them ! --
}
});
// Launch the async query
restHelper.getRemoteAdverts();
}
谢谢!
答案 0 :(得分:0)
我不确定这个问题。您有一个可以调用的异步方法,但由于它是异步方法,它无法返回结果,因此您有两个解决方案: - 等待所有数据都可用的方法,但是你失去了异步的好处。 - 实现Oberserver / Observable模式。
对于第一个选项,请查看RestHelper,也许您已经有了解决方案。 第二个选项的示例:
public static void requestAdverts(Context context) {
RestHelper restHelper = new RestHelper();
final AdvertListener thisInstance = this;
restHelper.setOnRestListener(new OnRestListener<Advert>() {
@Override
public void onDataAvailable(ArrayList<Advert> result) {
thisInstance.notifyDataLoaded(result);
}
});
// Launch the async query
restHelper.getRemoteAdverts();
创建一个界面:
interface AdvertListener {
notifyDataLoaded(ArrayList<Advert> result);
}
最后让主类(调用requestAdverts方法的那个)实现你的新接口。
答案 1 :(得分:0)
好吧,请重新访问你的功能设计,你在同步函数(getAdverts)中异步加载是很累人的。如果您的函数是同步的,那么只需同步加载列表并返回。
如果出于任何原因,如果你想继续当前的方法,请在setOnRestListener之后阻止调用者,当你得到一个回调(onDataAvailable)时解锁它并返回你的列表。
您可以使用ConditionVariable。
阻止来电者: ConditionVariable.block(); ConditionVariable.close();
取消阻止/打开来电者: ConditionVariable.open(); 希望,这有帮助。