4

我已經搜索了很多關於此,但無法找到任何解決方案。很長一段時間我一直在使用Volley來處理我的網絡通信。最近我決定使用SyncAdapter將我的數據同步到服務器。在onPerformSync()方法中,我想我將使用Volley將數據發送到服務器,因爲使用Volley很容易進行GET,POST請求。使用同步適配器排球

問題 - SyncAdapter和Volley都使用他們自己的單獨線程。因此,當我從onPerformSync()方法中啓動Volley請求時,SyncAdapter不會等待Volley請求完成並在收到Volley的onResponse()onErrorResponse()回調之前完成同步。在第一次通話成功返回後,我需要在SyncAdapter內進一步撥打網絡電話。

示例代碼 -

@Override 
    public void onPerformSync(Account account, Bundle extras, String authority, 
           ContentProviderClient provider, SyncResult syncResult) { 

     JsonObjectRequest jReq = new JsonObjectRequest(Method.POST, url, data, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.i(TAG, "response = " + response.toString()); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e(TAG, "error = " + error.getMessage()); 
       } 
      }); 

     AppController.getInstance().addToRequestQueue(jReq); 

    //onPerformSync() exits before request finished 
    } 

問題 - 因此,我怎麼做SyncAdapter等到網絡響應由排球收到?

回答

3

發出同步排氣請求。

RequestFuture<JSONObject> future = RequestFuture.newFuture(); 
JsonObjectRequest request = new JsonObjectRequest(URL, null, future, future); 
requestQueue.add(request); 

,然後使用:

try { 
    JSONObject response = future.get(); // this will block (forever) 
} catch (InterruptedException e) { 
    // exception handling 
} catch (ExecutionException e) { 
    // exception handling 
} 

代碼來自:Can I do a synchronous request with volley?