Я создал 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
, которую я использую для создания сетевых запросов, которые являются асинхронными. Пожалуйста помоги.
Хорошо, я знаю, что делаю это асинхронно, но что именно вызывает запуск IntentService параллельно? Не могли бы вы рассказать об этом. – Vicky
@ Vicky, вы создаете свою работу в другом потоке из IntentService. IntentService запускает, скажем, поток 4, и вы выполняете сетевой вызов по потоку, скажем, 6. Таким образом, вы не используете класс IntentService. В этом случае вы можете использовать Сервис. – azizbekian
@azizbekian, я понял, что создаю еще один поток внутри моего IntentService, но 'Callback' из' Retrofit' должен быть выполнен в потоке IntentService, правильно? – Vicky