1

Android Developer Summit 2015 で発表されたものと同様のアーキテクチャを実装しようとしています: https://github.com/yigit/dev-summit-architecture-demo。私のアプリケーションには、ネットワーク リクエストを処理する単純なクラスがあります。このクラスは、リクエストに Retrofit 2 を使用します。また、依存性注入に Dagger 2 を使用しています。

私は非常に単純なことを達成しようとしています。私のアクティビティはコントローラーにデータをフェッチするように指示します。次にコントローラーは、REST クライアントを呼び出して、ネットワーク リクエストを実行します。リクエストが正常に完了したら、アクティビティにイベントをブロードキャストして、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);
    }
}

どんな助けでも大歓迎です。

4

0 に答える 0