无法从工作线程发送广播到主线程

时间:2016-01-10 13:47:07

标签: android multithreading rest broadcastreceiver localbroadcastmanager

我正在尝试实施类似于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);
    }
}

非常感谢任何帮助。

0 个答案:

没有答案