2013-09-24 70 views
0

我需要使用现有的API,假设它将直接在Activity中用于简单的应用程序。我的用例需要从Service中调用API,并等待所需的Handler返回所需的数据。Android/Java在返回服务之前等待处理程序

我已经尝试了许多没有成功的Java并发选项。任何人都可以提出更好的方法?

下面是一个非常简化的例子,它比一个工作例子更伪代码。

public class dataConnection { 

Controlx xControl; 
CountDownLatch doneSignal = new CountDownLatch(1); 
Context c = null; 

private String data1; 

Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     setReturnData(msg); 
     doneSignal.countDown(); 
    } 
}; 

public dataConnection(Context ctx) { 
    this.c = ctx; 
    xControl = new Controlx (c, mHandler); 
}  

private void setReturnData(int rc) { 
    this.rc = rc; 
} 

private int getReturnData() { 
    return this.rc; 
} 

public int getRealData() { 

    //API will timeout in 10 seconds if data is not retrieved before that 
     xControl.dataCmd(10); 

    //Wait here for handler to finish and then retrieve data to return 
    doneSignal.await(); 

    int i = getReturnData(); 

    Log.v("log_tag", "RETURN NOW!!!!!!!!!!!!!!!"); 
    return data; 
} 

回答

0

如果Handler使用同一个线程中getRealData()方法你要防止它看到MessageLooper必须完成一件事,才能处理新事物。

如果你为处理程序创建一个新线程和循环,它将允许它们两个独立运行。根据您的需要,Future<Integer>对象也可能有用。

Looper | Android Developers

Future | Android Developers

+0

可以处理程序中创建,然后在子线程催生?我尝试了另一种方式,在getRealData内部创建了一个线程,这在一定程度上起作用,但在getRealData返回之前我找不到合理的方法来检索数据(即使使用AsyncTask .get方法)。 – Ressor

+0

是的,活页页面给出了一个可以做到这一点的示例类。传回信息可能会有点棘手。有几个选项是设置一个静态变量或引用,它是同步的,'doneSignal.away()'定期检查,或让'getRealData()'返回一个void,然后使用主处理函数或返回的'intent'继续之后在主线程上工作。如果没有指定doneSignal.away()的具体内容,可能会有很多不同的方式来实现它。 – Jon