2017-02-14 2 views
3

Я создал IntentService следующий образом:Android запросы Намерения службы работы работает паралельно

public class OrdersSyncService extends IntentService { 

    private static final String TAG = OrdersSyncService.class.getSimpleName(); 

    private Order orderObject; 

    public OrdersSyncService() { 
     super("OrdersSyncService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     //Util.showToast(getApplicationContext(), "Syncing Orders........"); 
     Log.d(TAG, "I'm running...."); 
     syncOrders(); 
    } 

    private void syncOrders() { 

     Database database = CouchBaseHelper.openCouchBaseDB(this); 
     JSONArray ordersJsonArray = new JSONArray(CouchBaseHelper.retrieveNotSyncedOrders(database)); 
     if (ordersJsonArray.length() != 0) { 
      uploadOrders(ordersJsonArray.toString()); 
      Log.d(TAG, "Orders syncing started."); 
     } else { 
      Log.d(TAG, "Nothing to sync."); 
     } 
    } 

    private void uploadOrders(String ordersJsonArray) { 

     RetrofitApi.ApiInterface apiInterface = RetrofitApi.getApiInterfaceInstance(); 
     final Call<Order> uploadOrders = apiInterface.uploadOrders(
       ordersJsonArray, 
       Util.getDeviceId(this), 
       AppPreference.getString(this, AppPreference.USER_ID) 
     ); 

     uploadOrders.enqueue(new Callback<Order>() { 
      @Override 
      public void onResponse(Call<Order> call, Response<Order> response) { 

       if (response.isSuccessful()) { 

        if (response.body().getStatus().equals("success")) { 

         orderObject = response.body(); 

         Log.d(TAG, "Server Response : " + orderObject.getMobileOrderIds()); 

         boolean flag = updateOrders(orderObject); 

         if (flag) { 
          Log.d(TAG, "Orders Synced And Updated."); 
          EventBus.getDefault().post(new SyncFinished(true)); 

         } else { 
          Log.d(TAG, "Orders Synced But Update Failed."); 
         } 

        } else { 

         Log.d(TAG, response.body().getMessage()); 

        } 

       } else { 

        Log.d(TAG, "Some Error. Sync Failed."); 

       } 

      } 

      @Override 
      public void onFailure(Call<Order> call, Throwable t) { 
       Log.d(TAG, "Network problem. Sync Failed."); 
       //Log.d("VICKY",call.request().url().toString()); 

      } 
     }); 
    } 

    private boolean updateOrders(Order order) { 
     Database database = CouchBaseHelper.openCouchBaseDB(this); 
     boolean flag = CouchBaseHelper.updateOrders(database, order); 
     return flag; 
    } 
} 

Что она делает это, он делает запрос сети и после запроса сети обновляет базу данных (я» м с использованием couchbaselite для андроида) с ответом. Теперь проблема заключается в том, что он выполняется параллельно, когда я делаю несколько запросов к нему. Андроид документация четко говорится, что: Creating a Background Service

запросы Работы выполняются последовательно. Если в IntentService выполняется операция, и вы отправляете ей другой запрос, запрос ожидает завершения первой операции.

Я звоню в эту службу из onResume метода деятельности. Поэтому всякий раз, когда активность возобновляется, эта услуга называется:

@Override 
protected void onResume() { 

    super.onResume(); 

    Intent ordersSyncServiceIntent = new Intent(SellerHomeActivity.this, OrdersSyncService.class); 
    startService(ordersSyncServiceIntent); 

} 

Я не знаю, в чем проблема. Я думаю, что это имеет какое-то отношение к библиотеке Retrofit, которую я использую для создания сетевых запросов, которые являются асинхронными. Пожалуйста помоги.

ответ

4

Вы делаете это асинхронно в этой строке:

uploadOrders.enqueue(new Callback<Order>() {...}); 

Используйте execute() способ делать это синхронно.

+0

Хорошо, я знаю, что делаю это асинхронно, но что именно вызывает запуск IntentService параллельно? Не могли бы вы рассказать об этом. – Vicky

+2

@ Vicky, вы создаете свою работу в другом потоке из IntentService. IntentService запускает, скажем, поток 4, и вы выполняете сетевой вызов по потоку, скажем, 6. Таким образом, вы не используете класс IntentService. В этом случае вы можете использовать Сервис. – azizbekian

+0

@azizbekian, я понял, что создаю еще один поток внутри моего IntentService, но 'Callback' из' Retrofit' должен быть выполнен в потоке IntentService, правильно? – Vicky

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