1

私は、LiveDataを含むViewModelを使用するActivityを持っています。これは、フォアグラウンドServiceから変更する必要があります。サービスからのLiveDataの更新

は何が必要なのである。

LiveDataは、それがServiceから変更されますときに、UIが更新されActivityから観察されます。これを行うには、MutableLiveDataを何とか使用する必要があります。

  1. 私はRoomデータベースにLiveDataを保存すべきか、この問題のよりエレガントな解決策はありますか?

  2. 部屋を使用する場合は、解決方法は、これを保存して更新する方法単一でユニークなエンティティ?推奨Androidのアーキテクチャに基づいて

答えて

0

、あなたがViewModelにデータを供給する使命を帯びたクラス以外の何もないRepositoryを、持っている必要があり、リポジトリはRoom databaseからデータをフェッチしにリフレッシュするためにサービスを要求しますデータベース。 RoomDBから取得されたデータはライブデータであり、サービスによって更新されると、そのオブザーバは起動されます。迅速な答えをAndroid architecture components

public class MovieRepository { 
 

 
    private static final String language = "en-US"; 
 
    private static final String sortBy = "popularity.desc"; 
 
    private static final String includeAdult = "false"; 
 
    private static final String includeVideo = "false"; 
 
    private static final String page = "1"; 
 

 
    Resources mResources; 
 

 
    MovieDatabase mMovieDatabase; 
 
    MoviesInterfaceImpl mMoviesInterface; 
 
    MoviesWatchApplication mMoviesWatchApplication; 
 

 

 
    public MovieRepository(MovieDatabase movieDatabase, 
 
          MoviesInterfaceImpl moviesInterface, 
 
          MoviesWatchApplication moviesWatchApplication) { 
 

 
     mMovieDatabase = movieDatabase; 
 
     mMoviesInterface = moviesInterface; 
 
     mMoviesWatchApplication = moviesWatchApplication; 
 
    } 
 

 
    public LiveData<List<Movie>> getMovies() { 
 
     mResources = mMoviesWatchApplication.getApplicationContext().getResources(); 
 
     refreshMovies(); 
 

 

 

 
     LiveData<List<Movie> > movies = mMovieDatabase.movieDao().getMovies(); 
 
     return movies; 
 
    } 
 

 
    private void refreshMovies() { 
 
     mMoviesInterface.discoverMovies(
 
       mResources.getString(R.string.api_key), 
 
       language, sortBy, includeAdult, includeVideo , page 
 
     ).enqueue(new Callback<DiscoverResponse>() { 
 

 
      @RequiresApi(api = Build.VERSION_CODES.N) 
 
      @Override 
 
      public void onResponse(Call<DiscoverResponse> call, Response<DiscoverResponse> response) { 
 
       if(response.code() == 200) { 
 
        List<Movie> movieList = new ArrayList<>(); 
 

 
        response.body().getResults().forEach((result) -> { 
 
         Movie movie = new Movie(result); 
 
         movieList.add(movie); 
 
        }); 
 

 
        mMovieDatabase.movieDao().addMovies(movieList); 
 
       } 
 
      } 
 

 
      @Override 
 
      public void onFailure(Call<DiscoverResponse> call, Throwable t) { 
 

 
      } 
 
     }); 
 
    } 
 
}

+0

ありがとう! 私の用途は少し異なります。今のところ、私は単一のエンティティの格納と変更にのみ関心がありますが、DaoはMutableLiveDataをクエリの戻り値の型として受け入れていないようです。 サービスからこのエンティティを編集するにはどうすればよいですか? – adriennoir

関連する問題