2016-04-23 202 views
0

实施例:如何异步方法调用(回调)转换为一个同步方法调用Android中

同步Vesrion:

INT天气=的GetWeather();

异步版本:

的GetWeather(回调)其他类和当其他类准备返回值,它使用回调。 callback.receiveWeather(温度);并且回调对象具有重写的receiveWeather(int)方法。

问:

现在我该怎样转换异步方法在Android的同步调用。你能举个例子吗?我知道它有什么要做的线程,等待()等,但不知道要执行它。

+0

请注意,您通常不应该在UI线程上调用(并且通常无法获得返回的结果)这样的方法。 –

+0

@ChrisStratton我认为这个问题有一个价值,因为如果你已经在'AsyncTask'中,并且试图避免长链异步调用,每次调用写一行代码,这样的转换就会很有用。 – kftse

回答

-1

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

public void getWeather(WhateverCallback<Type> callback) 

要这样:

public Type getWeather() 
+0

为什么选择投票? – nasch

0

下面的代码你想要做什么,但它是更为最好只创建一个阻塞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(); 
       } 
      } 
     } 

    } 
} 

请参阅Guarded Blocks