我正在尝试实现一种类似于 2015 年 Android 开发者峰会上提出的架构:https ://github.com/yigit/dev-summit-architecture-demo 。我的应用程序有一个处理网络请求的简单类。该类对请求使用 Retrofit 2。我也在使用 Dagger 2 进行依赖注入。
我正在尝试实现一些非常简单的事情。我的活动告诉控制器获取数据。然后控制器调用我的 REST 客户端以执行网络请求。当请求成功完成时,我想向我的 Activity 广播一个事件,以便它可以更新 UI。但是,该事件没有被广播。
我正在使用 LocalBroadcastManager 广播事件。我的活动在 onResume/onPause 方法中注册/取消注册广播。我的 REST 客户端有一个通过依赖注入提供的应用程序上下文实例。REST 客户端使用应用程序上下文来发送广播。
我的第一个怀疑是没有发送广播,因为网络请求是在工作线程上执行的,而活动期望在主线程上进行广播。但是,如果 Android 文档是正确的,这种情况应该不会有问题。
这是我的活动。
public class BaseActivity extends AppCompatActivity {
private ApplicationComponent mApplicationComponent;
private EventBroadcastReceiver mEventBroadcastReceiver = new EventBroadcastReceiver();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplicationComponent = getMovieManagerApplication().getApplicationComponent();
}
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("now_playing");
LocalBroadcastManager.getInstance(this).registerReceiver(mEventBroadcastReceiver, intentFilter);
}
@Override
protected void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mEventBroadcastReceiver);
}
protected MovieManagerApplication getMovieManagerApplication() {
return (MovieManagerApplication) getApplication();
}
protected ApplicationComponent getApplicationComponent() {
return mApplicationComponent;
}
protected void update(Intent intent) {
}
private class EventBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
update(intent);
}
}
}
这是我的 REST 客户端。
public class MovieRestClient extends BaseRestClient implements Callback<MovieResponse> {
@Inject
public MovieApiService mMovieApiService;
@Inject
public Context mApplicationContext;
public MovieRestClient(ApplicationComponent applicationComponent) {
super(applicationComponent);
getApplicationComponent().inject(this);
}
@Override
public void onResponse(Response<MovieResponse> response) {
if (response.isSuccess()) {
Parcelable parcelable = Parcels.wrap(response.body());
MovieResponse movieResponse = Parcels.unwrap(parcelable);
Intent intent = new Intent("now_playing");
intent.putExtra(MovieResponse.class.getName(), parcelable);
LocalBroadcastManager.getInstance(mApplicationContext).sendBroadcast(intent);
}
}
@Override
public void onFailure(Throwable t) {
}
public void getNowPlaying() {
mMovieApiService.getNowPlaying(API_KEY).enqueue(this);
}
public void getPopular() {
mMovieApiService.getPopular(API_KEY).enqueue(this);
}
public void getTopRated() {
mMovieApiService.getTopRated(API_KEY).enqueue(this);
}
public void getUpcoming() {
mMovieApiService.getUpcoming(API_KEY).enqueue(this);
}
}
任何帮助将不胜感激。