4

Я много искал об этом, но не могу найти решение. Я использую Volley в течение длительного времени, чтобы обрабатывать сетевое общение. Недавно я решил использовать SyncAdapter для синхронизации моих данных с сервером. Внутри метода onPerformSync() я думал, что буду использовать Volley для отправки данных на сервер, так как очень легко с Volley сделать GET, POST-запросы.Использование Volley с адаптером синхронизации

Задача - SyncAdapter и Volley оба используют свои собственные отдельные потоки. Поэтому, когда я инициирую запрос Volley изнутри метода onPerformSync(), SyncAdapter не дожидается завершения запроса Volley и завершения синхронизации до получения onResponse() или onErrorResponse() обратного вызова Volley. Мне нужно сделать дальнейшие сетевые вызовы внутри 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 подождать, пока сетевой ответ не будет получен Volley?

ответ

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?

Смежные вопросы