Проблема в том, что метод @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 ответ
Проблема в том, что метод 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;
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.