1

例子:

同步版本:

int 天气 = getWeather();

异步版本:

getweather(callback) 到另一个类,当其他类准备好返回值时,它使用回调。callback.receiveWeather(温度); 并且回调对象有一个被覆盖的 receiveWeather(int) 方法。

问题:

现在我如何将异步方法转换为 android 中的同步调用。你能给我一个例子吗?我知道它有一些事情要做线程,等待()等..但不知道要实现它。

4

2 回答 2

1

以下代码可以满足您的需求,但最好只创建一个阻塞 getter 并将其包装起来AsyncTask,以防还需要异步例程。

当这是嵌套时,一定不要

  • wait()主线程
  • 在同一个线程中运行两个段

尤其是如果你包装了一些没有很好记录的线程机制的仅异步 API,这可以使这两种方法在同一个线程上运行。

public class AsyncToSync{

    private Object lock= new Object();
    private boolean ready = false;

    public syncCallToAsyncMethod(){

        new AsyncMethodProvider().doAsync(new CompletionListener(){

            public void onComplete(){
                // TODO: Do some post-processing here

                synchronized(lock){
                    ready = true;
                    lock.notifyAll();
                }
            }

        })

        synchronized (lock) {
            while (!ready) {
                try {
                    lock.wait();
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
        }

    }
}

请参阅受保护的块

于 2016-05-18T23:44:02.667 回答
-1

在被调用的方法中,不是调用回调方法并传入结果,而是直接返回结果。因此,从此更改方法签名:

public void getWeather(WhateverCallback<Type> callback)

对此:

public Type getWeather()
于 2016-04-24T04:01:46.490 回答