I’m facing an issue here, and I need some help.
In this application, we make Retrofit calls in the UI thread – right in the Activity -, this means that we don’t have a good architecture (i know).
The problem I’m facing, is that i need to make an Synchronous GET when the user click a button, and the GET will give me which fragment the user will be redirected, and i need to wait the response of the web service.
Like this:
Button.setOnClickListener(v -> { getWhichLandingShows(); // Here I make the retrofit call if (mGoToNewLandingPage) return LandingSaleV3Fragment.newInstance(); else return NewLandingSaleFragment.newInstance(); });
I need a method that works, because i already tried everything, and I always get a MainThreadException.
This was my last try:
private void getWhichLandingShowSync() { InteractionServices interactionServices = RestServices.getInteractionServices(); Call<GetLandingResponse> call = interactionServices.getLandingPage(); try { call.execute(); } catch (IOException e) { e.printStackTrace(); } }
I already tried to put the Retrofit call in a separated class that extends IntentService, like this, but without success:
public class BackgroundService extends IntentService { private static final String TAG = "NewLpIntentService"; public BackgroundService() { super(TAG); } @Override protected void onHandleIntent(Intent intent) { InteractionServices interactionServices = RestServices.getInteractionServices(); Call<GetLandingResponse> call = interactionServices.getLandingPage(); try { call.execute(); } catch (IOException e) { e.printStackTrace(); } } }
Advertisement
Answer
Using call.execute()
is not a good idea in your case. It runs the request on the current thread. You could use call.enqueue(callback)
and then show a progressbar. The request runs on a background thread and once you get the callback on the current thread, navigate to other fragments when onResponse
callback is successful.