Search code examples
androidretrofitotto

Retrofit with Otto - Subscribe not called


I have spent many hours on this problem but still not able to find the right way. Hopefully, someone could help.

Situation

My app requires to download remote data using Retrofit with Otto. Most of the work has been done, except that the Otto's subscriber never get called.

  • download data with retrofit, done
  • implement retrofit callback, done
  • publisher post call back result to otto event bus, done
  • subscriber get result from otto event bus, not called

Problem

  • The Otto's subscriber is never called.

Code

MyApplication.java

     public class MyApplication extends Application{
     private static Bus mBus;
     @Override
       public void onCreate() {
       super.onCreate(); 
    }

    public static Bus getEventBus() {
    if(mBus==null) {
        mBus = new Bus(ThreadEnforcer.ANY);
    }
    return mBus;
   }
}

MyFavouriteFragment.java

public class MyFavouriteFragment extends Fragment implements AdapterView.OnItemClickListener {

public MyFavouriteFragment() {
}

public static MyFavouriteFragment newInstance() {
    MyFavouriteFragment fragment = new MyFavouriteFragment();
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(MainActivity.TAG, "oncreate register bus");
    MyApplication.getEventBus().register(getActivity());
}


@Override
public void onResume() {
    super.onResume();
}

@Override
public void onPause() {
    super.onPause();
    MyApplication.getEventBus().unregister(getActivity());
}

public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // apply first download before setOnScrollListener
    downloadAds(0);
}


private void downloadAds(final int getAdFromIndex) {
    // download data from server
    RestClient.getApiService().getFavouriteAd(
            getAdFromIndex,
            Constant.numOfAdPerFetch,
            userId,
            true,
            new GetMyFavouriteAd.Callback());
}

// This one never get called !!!!!!!!!!!!!!!!!!!!!!!!!!
@Subscribe
public void onGetMyFavouriteAdEvent(GetMyFavouriteAd.GetMyFavouriteAdEvent event){
    Log.d(MainActivity.TAG, "onGetMyFavouriteAdEvent");
    postDownloadSetup();
}

@Subscribe
public void onRetrofitErrorEvent(RetrofitErrorEvent event){
    Log.d(MainActivity.TAG, "getFavouriteAd failed " + event.getError().toString());
    postDownloadSetup();
}
}

GetMyFavouriteAd.java

 public class GetMyFavouriteAd {

public static final class Callback implements retrofit.Callback<List<GenericAd>> {
    @Override
    public void success(List<GenericAd> genericAdList, Response response) {
        Log.d(MainActivity.TAG, "GetMyFavouriteAd call back");
        MyApplication.getEventBus().post(new GetMyFavouriteAdEvent());
    }

    @Override
    public void failure(RetrofitError error) {
        Log.d(MainActivity.TAG, "GetMyFavouriteAd call back failed");
        MyApplication.getEventBus().post(new RetrofitErrorEvent(error));
    }
}

// Otto Event
public static final class GetMyFavouriteAdEvent {
    List<GenericAd> genericAdList;
    Response response;

    public GetMyFavouriteAdEvent(){
        // this one get called successfully
        Log.d(MainActivity.TAG, "ini GetMyFavouriteAdEvent");
    }

    public List<GenericAd> getGenericAdList() {
        return genericAdList;
    }

    public void setGenericAdList(List<GenericAd> genericAdList) {
        this.genericAdList = genericAdList;
    }

    public Response getResponse() {
        return response;
    }

    public void setResponse(Response response) {
        this.response = response;
    }
}
}

RestClient.java

  public class RestClient {
private static ApiService apiService;

public static ApiService getApiService() {
    if (apiService == null) {
        RestAdapter restAdapter = new RestAdapter.Builder()
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setEndpoint(Constant.baseUri)
                .build();
        apiService = restAdapter.create(ApiService.class);
    }

    return apiService;
}
}

ApiService.java

  public interface ApiService {
    // get favourite ad
@FormUrlEncoded
@POST("/getFavouriteAdByUserId.php")
void getFavouriteAd(
        @Field("getAdFromIndex") int getAdFromIndex,
        @Field("numOfAdPerFetch") int numOfAdPerFetch,
        @Field("userId") String userId,
        // true to return ad.*, false to return adId only
        @Field("getAdDetails") boolean getAdDetails,
        Callback<List<GenericAd>> cb
);
}

Solution

  • register/unregister the Fragment and not the Activity

     MyApplication.getEventBus().register(getActivity());
    

    to

     MyApplication.getEventBus().register(this);
    

    same for unregister