Android Intent Service工作请求并行运行

Vic*_*cky 4 android retrofit android-intentservice retrofit2


我创建了一个IntentService,如下所示:

    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它的作用是,它发出一个网络请求,并在网络请求之后用响应更新数据库(我使用的是couchbaselite for android).现在问题是当我向它发出多个请求时它并行执行.android文档明确指出: 创建后台服务

工作请求按顺序运行.如果某个操作在IntentService中运行,并且您向其发送另一个请求,则该请求将一直等到第一个操作完成.

我从onResumeActivity的方法调用此服务.因此,每当活动恢复时,都会调用此服务:

@Override
protected void onResume() {

    super.onResume();

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

}
Run Code Online (Sandbox Code Playgroud)

我不知道问题是什么.我认为它与Retrofit库有关,我用它来制作异步的网络请求.请帮忙.

Ily*_*kov 5

您在此行中异步执行此操作:

uploadOrders.enqueue(new Callback<Order>() {...});
Run Code Online (Sandbox Code Playgroud)

使用execute()方法同步执行.

  • @Vicky,你是在IntentService的另一个线程中产生你的工作.IntentService运行,比如说线程4,你在线程上运行你的网络调用让我们说6.因此,你没有使用IntentService类.在这种情况下,您可以使用服务. (2认同)