2013-09-24 71 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