[英]Room Livedata.observeforever not working after activity resumes
我已經使用以下簡單的Room測試代碼測試了一些測試用例。 恢復主要活動后,“ dao.getAll()。observeForever()”不起作用。 正確插入了新單詞,但只有觀察無效。 如果我使用dao.getAll()。observe(),它將始終正常工作。 不允許在活動的onCreate()方法上使用observeForever嗎?
AppDatabase.java
@Database(entities = {Word.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase sInstance;
public abstract WordDao wordDao();
public static AppDatabase getInstance(Context context) {
if (sInstance == null) {
synchronized (AppDatabase.class) {
if (sInstance == null) {
sInstance = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "word.db").addMigrations(new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
}
}).build();
}
}
}
return sInstance;
}
}
Word.java
@Entity
public class Word {
@PrimaryKey(autoGenerate = true)
public int uid;
public String word;
public Word(String word) {
this.word = word;
}
}
WordDao.java
@Dao
public interface WordDao {
@Query("Select * from word")
LiveData<List<Word>> getAll();
@Update
void update(Word word);
@Insert
void insert(Word word);
}
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.textview);
WordDao dao = AppDatabase.getInstance(this).wordDao();
dao.getAll().observeForever(wordlist -> {
StringBuilder builder = new StringBuilder();
for (Word w : wordlist ) {
builder.append(w.word).append(", ");
}
tv.setText(builder.toString());
});
findViewById(R.id.add).setOnClickListener(view -> new Thread(() -> {
dao.insert(new Word("haha"));
}).start());
}
的build.gradle
dependencies {
def lifecycle_version = "1.1.1"
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
testImplementation "android.arch.core:core-testing:$lifecycle_version"
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
testImplementation "android.arch.persistence.room:testing:$room_version"
}
切勿使用那樣的架構組件。 您應該使用MVVM,因為它們旨在解決此問題。 模型應包含您將要使用哪個房間的數據。 然后,您的視圖應僅包含表示形式,並包含對視圖模型的第三個組件的引用。 您的代碼中缺少ViewModel,它的內容如下:
public class WordViewModel extends ViewModel {
private MutableLiveData<List<Word>> mWords;
private AppDatabase mDb;
public WordViewModel(@NonNull Application application) {
super(application);
mWords = new MutableLiveData<List<Word>>();
mDb = AppDatabase.getInstance(application.getApplicationContext());
}
public LiveData<List<User>> getWords() {
loadWords();
return words;
}
private void loadWords() {
return mDb.wordDao().getAll();
}
}
然后您的活動將更改為
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView tv = findViewById(R.id.textview);
WordViewModel viewModel = ViewModelProviders.of(this).get(WordViewModel.class);
viewModel.getWords().observe(this, new Observer<List<Word>>() {
@Override
public void onChanged(@Nullable ResponseDataList resp) {
StringBuilder builder = new StringBuilder();
for (Word w : wordlist ) {
builder.append(w.word).append(", ");
}
tv.setText(builder.toString());
}
});
}
讓我知道評論中是否有任何不清楚的地方
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.