![](/img/trans.png)
[英]How to get response data back to main class while using asynchronous in Okhttp android Library?
[英]How to get async call to return response to main thread, using okhttp?
我正在嘗試為Android編寫程序,並且使用okhttp進行json調用。 我真的很想將我的回復返回到正在創建的線程之外。 我需要為異步調用創建線程,否則會得到NetworkOnMainThreadException。 問題是,即使我的responseString是類中的全局變量,我的響應字符串似乎也無法從“ onResponse”方法之外獲取。 由於它是異步的,因此線程不會及時運行以在返回之前在全局變量中獲取我的值。 在返回responseString值之前,如何確保獲得響應?
這是我的代碼:
public static String getUserProductCategoriesFromServer(Activity activity, final String UID, final String EXPIRY, final String CLIENT, final String ACCESSTOKEN)
{
activity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
final OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.url(JsonStorage.getJsonUserProductCategories())
.get()
.addHeader("access-token", ACCESSTOKEN)
.addHeader("client", CLIENT)
.addHeader("expiry", EXPIRY)
.addHeader("uid", UID)
.build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
}
@Override
public void onResponse(Call call, Response response) throws IOException
{
try
{
response = client.newCall(request).execute();
String json = response.body().string();
JSONObject jsonObject = new JSONObject(json);
JSONArray jsonData = (JSONArray) jsonObject.getJSONArray("user_product_category_names");
responseString = jsonData.toString();
Log.v("TEST1", jsonData.toString()); //RETURNS JSON :D
Log.v("TEST2", responseString); //RETURNS JSON :D
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}
});
}
});
Log.v("TEST3", responseString); //RETURNS "NULL" :(
return responseString;
}
從異步世界到同步世界(基於線程)獲取結果的常用方法是使用Futures 。 許多庫都實現了這樣的接口,例如Guava。 標准java具有名為CompletableFuture的實現。 它使用具有不同名稱和簽名的方法,但是可以輕松實現適配器:
class CallbackFuture extends CompletableFuture<Response> implements Callback {
public void onResponse(Call call, Response response) {
super.complete(response);
}
public void onFailure(Call call, IOException e){
super.completeExceptionally(e);
}
}
然后,您可以按以下方式使用它:
CallbackFuture future = new CallbackFuture();
client.newCall(request).enqueue(future);
Response response = future.get();
有了Response
,您可以像在第一個變體中那樣提取responseString
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.