如何将异步方法调用(回调)转换为Android中的同步方法调用

时间:2016-04-23 19:54:07

标签: android multithreading asynchronous message-handlers

示例:

同步Vesrion:

int weather = getWeather();

异步版本:

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

问题:

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

2 个答案:

答案 0 :(得分:0)

以下代码可以满足您的需求,但是如果只需要异步例程,只需创建一个阻塞getter并用AsyncTask包装它就更好了。

当嵌套时,请确保

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

特别是如果你用一个没有良好记录的线程机制包装一些只有async的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();
                }
            }
        }

    }
}

请参阅Guarded Blocks

答案 1 :(得分:-1)

在被调用的方法中,只需返回结果,而不是调用回调方法并传入结果。所以改变方法签名:

public void getWeather(WhateverCallback<Type> callback)

对此:

public Type getWeather()