同步API调用

时间:2018-02-26 18:33:53

标签: android api android-asynctask controller

我正在开发Android应用程序,添加了一项通过API调用获取和保存数据的新功能。

这些调用是在片段中进行的。在AsyncTask中进行了调用,我不想为每个调用创建一个AsyncTask,所以我只是尝试在某些函数中向我的控件发送参数,但是当我每次尝试调用时调试没有使用AsyncTask,我得到了一个IOException"取消了"。有没有办法在不使用同一片段中的AsyncTasks的情况下执行此操作?

这是AsyncTask:

private void validateUnit(@NonNull String unitCode, final int routeId, final boolean goodCondition) {

    mUnitDetails = new UnitDetails();

    if (mFindUnitAysncTask != null) {
        mFindUnitAysncTask.cancel(true);
    }
    mFindUnitAysncTask = new AsyncTask<String, Void, FindUnitResponse>() {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            showProgressDialog();
        }

        @Override
        protected FindUnitResponse doInBackground(String... params) {
            FindUnitResponse unitResponse = mUnitController.findUnit(params[0], routeId);
            FindUnitDetailsResponse unitDetailsResponse = mUnitController.getUnitDetails(
                    unitResponse.getUnits().get(0), mUser);
            if(unitDetailsResponse.isSuccess()) {
                mUnitDetails.setBranchCode(unitDetailsResponse.getBranchCode());
                mUnitDetails.setBranchName(unitDetailsResponse.getBranchName());
                mUnitDetails.setCompanyId(unitDetailsResponse.getCompanyId());
                mUnitDetails.setEconomicNumber(unitDetailsResponse.getEconomicNumber());
                mUnitDetails.setFuelType(unitDetailsResponse.getFuelType());
                mUnitDetails.setFuelTypeId(unitDetailsResponse.getFuelTypeId());
                mUnitDetails.setFuelPrice(unitDetailsResponse.getFuelPrice());
                mUnitDetails.setModel(unitDetailsResponse.getModel());
                mUnitDetails.setBrand(unitDetailsResponse.getBrand());
                mUnitDetails.setUnitType(unitDetailsResponse.getUnitType());
                mUnitDetails.setRouteCode(unitDetailsResponse.getRouteCode());
                mUnitDetails.setRealTrips(unitDetailsResponse.getRealTrips());
                mUnitDetails.setMaximumMileageRange(unitDetailsResponse.getMaximumMileageRange());
            }
            else {
                showMessage(unitDetailsResponse.getMessage());
            }
            return unitResponse;
        }

        @Override
        protected void onPostExecute(FindUnitResponse response) {
            super.onPostExecute(response);
            dismissProgressDialog();
            if (response != null && response.isSuccess()) {
                //Unit unit = response.getUnits().get(0);
                unit = response.getUnits().get(0);

                finishChecklist(unit, goodCondition);
            } else {
                showMessage(response.getMessage());
                saveChecklist();
            }
        }

        @Override
        protected void onCancelled() {
            super.onCancelled();
            dismissProgressDialog();
        }
    }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, unitCode);
}

随后我获取了车辆的细节。然后我有一个名为validateMileage的方法。

private void validateMileage(@NonNull Unit unit, @NonNull User user, @NonNull int mileage, int travels,
                             final boolean dayFinished) {

  List<Incident> incidents = mIncidentController.getIncidentList();
  Incident suspiciousMileageIncident = mIncidents.get(2);
  List<Manager> managers = mManagersController.findByIncidentId(suspiciousMileageIncident.getId());
..... 
}

如果我只是尝试调用.getIncidentsList或.findByIncidentId这样的调用,当我等待响应时,我得到了一个IOException。但是如果我在AsyncTask中进行调用,则没有错误。

0 个答案:

没有答案