使用 Otto 进行改造 - 未调用订阅
Retrofit with Otto - Subscribe not called
我在这个问题上花了很多时间,但仍然找不到正确的方法。
希望有人能提供帮助。
情况
我的应用需要使用 Retrofit with Otto 下载远程数据。大部分工作已经完成,除了 Otto 的订阅者从未接到电话。
- 下载改造后的数据,完成
- 实现改造回调,完成
- 发布者post 将结果回调到 otto 事件总线,完成
- 订阅者从 otto 事件总线获取结果,未调用
问题
- 从未呼叫 Otto 的用户。
代码
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
);
}
register/unregister 片段而不是 Activity
MyApplication.getEventBus().register(getActivity());
至
MyApplication.getEventBus().register(this);
注销相同
我在这个问题上花了很多时间,但仍然找不到正确的方法。 希望有人能提供帮助。
情况
我的应用需要使用 Retrofit with Otto 下载远程数据。大部分工作已经完成,除了 Otto 的订阅者从未接到电话。
- 下载改造后的数据,完成
- 实现改造回调,完成
- 发布者post 将结果回调到 otto 事件总线,完成
- 订阅者从 otto 事件总线获取结果,未调用
问题
- 从未呼叫 Otto 的用户。
代码
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
);
}
register/unregister 片段而不是 Activity
MyApplication.getEventBus().register(getActivity());
至
MyApplication.getEventBus().register(this);
注销相同