0

请原谅我的法语英语!

所以,我的 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();
    }

谢谢 !!

4

2 回答 2

0

好吧,请重新审视你的函数设计,你厌倦了在同步函数(getAdverts)中进行异步加载。如果您的函数是同步的,那么只需同步加载列表并返回。

如果出于任何原因,如果您想继续使用当前方法,请在 setOnRestListener 之后阻止调用者,当您收到回调(onDataAvailable)时将其解锁并返回您的列表。

为此,您可以使用 ConditionVariable。

阻塞调用者:ConditionVariable.block(); 条件变量.close();

解除阻塞/打开调用者:ConditionVariable.open(); 希望这可以帮助。

于 2013-01-29T19:11:48.240 回答
0

我不确定这个问题。您有一个可以调用的异步方法,但由于它是一个异步方法,因此它无法返回您的结果,因此您有 2 个解决方案: - 在方法中等待所有数据都可用,但您失去了异步的好处。- 实现 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 方法的类)实现您的新接口。

于 2013-01-29T18:58:20.603 回答