Комната Livedata.observe Forever не работает после возобновления деятельности - PullRequest
0 голосов
/ 25 июня 2018

Я проверил несколько тестовых случаев, используя простой код для проверки комнат, как показано ниже. "dao.getAll (). наблюдаемForever ()" не работает после возобновления основного действия. новые слова вставлены правильно, но только наблюдение не работает. Если я использую dao.getAll (). Наблюдаем (), он всегда работает правильно. Не разрешается использовать наблюдающийForever для метода onCreate () действия?

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"
}

1 Ответ

0 голосов
/ 25 июня 2018

Никогда не используйте такие архитектурные компоненты.Вы должны использовать MVVM, так как они предназначены для работы над этим.Модель должна включать ваши данные о том, что комната будет делать.Тогда Ваш View должен содержать только презентацию и ссылку на третий компонент View-Model.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());
        }
    });
}

Дайте мне знать, если что-то не понятно в комментариях

...