Проблема в том, что метод @Overide processFinish вызывается первым перед методом SaveExerciseDetailsTask.java doInBackground, в чем проблема в моем коде?

MainActivity.java

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sharedPref = new SharedPref(this);

    initToolbar();
    initComponentMenu();
    apiInterface = RetrofitInstance.getRetrofitInstance().create(GetPersonsDataService.class);


    saveExerciseDetailsTask = (SaveExerciseDetailsTask) new SaveExerciseDetailsTask(apiInterface,getApplicationContext(), new SaveExerciseDetailsTask.AsynResponse() {
        @Override
        public void processFinish(ArrayList<String> data) {
   //problem this is getting hit at first instead of saveExerciseDetailsTask
            Toast.makeText(getApplicationContext(), "Back p finished....."+data.size(), Toast.LENGTH_SHORT).show(); 

        }
    }).execute("1476","2075");



    prepareBanner();
    prepareInterstitial();

}

SaveExerciseDetailsTask.java

public class SaveExerciseDetailsTask extends AsyncTask<String, Void, ArrayList<String> > {

    public interface AsynResponse {
        void processFinish(ArrayList<String>  output);
    }

    AsynResponse asynResponse = null;
    private Exception exception;
    private Context mContext;
    GetPersonsDataService apiInterface;
    ArrayList<String> emptyArrayOfGif = new ArrayList<>();

    public SaveExerciseDetailsTask(GetPersonsDataService apiInterfaceObj ,Context context, AsynResponse asynResponse) {
        mContext = context;
        apiInterface = apiInterfaceObj;
        this.asynResponse = asynResponse;
        //  Toast.makeText(mContext, "Checking details, be patience...", Toast.LENGTH_LONG).show();
    }

    @Override
    protected ArrayList<String> doInBackground(String... strings) {
       //    Toast.makeText(mContext, "do in background..........."+strings[0], Toast.LENGTH_SHORT).show();

          Log.d("s","do in background..........."+strings[0]+"------------------------------------<-||->--------------------------"+strings);


          ExerciseResponse login = new ExerciseResponse(strings[0],strings[1]);

        Call<ExerciseListsDetailsList> call1 = apiInterface.getExerciseJsonData(strings[0],strings[1]);

        call1.enqueue(new Callback<ExerciseListsDetailsList>() {
            @Override
            public void onResponse(Call<ExerciseListsDetailsList> call, Response<ExerciseListsDetailsList> response) {
                if (response != null && response.body().getExList() != null) {

                    // save into the database the exercise information
                    List<ExerciseResponse> list = new ArrayList<>();
                    list=response.body().getExList();

                    //Save into Database and return GIF lists(this gif make another backgroud call to save each gif)
                    for(ExerciseResponse exerciseResponse:list){
                         
                        String imageGif=exerciseResponse.menu_icon;
                        String dayName=exerciseResponse.day_name;

                        System.out.println("dayname ="+dayForName);
                        emptyArrayOfGif.add(imageGif);
                    }


                    System.out.println("-----------------------------size---------------------------------"+response.body().getExList().size());



                }
            }

            @Override
            public void onFailure(Call<ExerciseListsDetailsList> call, Throwable t) {
                System.out.println("-----------------------------error in api call---------------------------------"+t.getLocalizedMessage());
            }
        });
        return emptyArrayOfGif;

 
    }

    protected void onPostExecute(ArrayList<String> siteData) {
        if(siteData !=null) {
            super.onPostExecute(siteData);
        }
        asynResponse.processFinish(siteData);
    } 
}
-1
Ashutosh Singh 27 Июн 2020 в 11:45

1 ответ

Лучший ответ

Проблема в том, что метод enqueue не является методом блокировки, а это означает, что doInBackground/onPostExecute завершится до получения ответа от удаленной службы.

retrofit2.Call предоставляет два метода выполнения HTTP-запросов:

execute() - синхронно отправить запрос и вернуть ответ.

enqueue(Callback) - асинхронно отправить запрос и уведомить обратный вызов о своем ответе.

Таким образом, вы можете использовать execute() вместо enqueue

Или используйте enqueue и укажите механизм блокировки, например CountDownLatch:

@Override
protected ArrayList<String> doInBackground(String... strings) {
    ...

    final CountDownLatch callCountDownLatch = new CountDownLatch(1);
    call1.enqueue(new Callback<ExerciseListsDetailsList>() {
        @Override
        public void onResponse(Call<ExerciseListsDetailsList> call, Response<ExerciseListsDetailsList> response) {
            ...
            callCountDownLatch.countDown();
        }

        @Override
        public void onFailure(Call<ExerciseListsDetailsList> call, Throwable t) {
            ...
            callCountDownLatch.countDown();
        }
    });

    try {
        callCountDownLatch.await();
    } catch (InterruptedException e) {
    }
    return emptyArrayOfGif;
}
0
Akaki Kapanadze 27 Июн 2020 в 10:06