public class ProfileActivity extends AppCompatActivity {
MyViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mutable_live_data);
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
viewModel.getFoundFriend().observe(this, new Observer<FriendEntity>() {
@Override
public void onChanged(FriendEntity friendEntity) {
if (friendEntity != null){
FriendEntity friend = friendEntity.getName();
textViewData.setText(name);
}
}
});
}
}
public class MyViewModel extends AndroidViewModel {
NormalRepository repository;
LiveData<FriendEntity> foundFriend;
public NormalViewModel(@NonNull Application application) {
super(application);
repository = new NormalRepository(application);
foundFriend = repository.getFoundFriend();
}
public LiveData<FriendEntity> getFoundFriend() {
return foundFriend;
}
public void find(long id) {
repository.find(id);
}
}
存储库:
public class NormalRepository {
MyDao dao;
LiveData<FriendEntity> foundFriend;
public NormalRepository(Application application) {
Database database = Database.getInstance(application);
this.dao = database.normalDao();
foundFriend = dao.findBy(-1L);
}
public void find(long id) {
new FindAsyncTask(dao).execute(id);
}
private class FindAsyncTask extends AsyncTask<Long, Void, LiveData<FriendEntity>>{
NormalDao dao;
public FindAsyncTask(NormalDao dao) {
this.dao = dao;
}
@Override
protected LiveData<FriendEntity> doInBackground(Long... longs) {
foundFriend = null;
return dao.findBy(longs[0]);
}
@Override
protected void onPostExecute(LiveData<FriendEntity> friendEntityLiveData) {
foundFriend = friendEntityLiveData;
}
}
public LiveData<FriendEntity> getFoundFriend() {
return foundFriend;
}
}
道:
@Dao
public interface MyDao {
@Query("SELECT * FROM friend_table WHERE id=:id")
LiveData<FriendEntity> findBy(long id);
}
我对Java有点生疏,因为我使用的是Kotlin,但在我看来:
FindAsyncTask无用。如果从查询返回LiveData,则可以在主线程上运行。您不需要使用后台线程。实际上,该函数立即返回LiveData(内容为null值),然后使用后台线程执行查询并更新LiveData。在这一点上,你得到了你的价值。现在,忘掉您的案例中的MutableLiveData。这是如果您需要更新自己的值,但在这种情况下,Room会处理这一点。所以回购会是这样的:
public class NormalRepository {
MyDao dao;
// you probably can transform all in a one liner, i bet you need just a context there, not application
public NormalRepository(Application application) {
Database database = Database.getInstance(application);
this.dao = database.normalDao();
}
public LiveData<FriendEntity> find(long id) {
new dao.findBy(id);
}
}
ViewModel只需要调用查询并存储LiveData
public class MyViewModel extends AndroidViewModel {
NormalRepository repository;
LiveData<FriendEntity> foundFriend;
// When you create the view Model you should already know what is the id
public NormalViewModel(@NonNull Application application, long id) {
super(application);
repository = new NormalRepository(application);
foundFriend = repository.repository.find(id);
}
public LiveData<FriendEntity> getFoundFriend() {
return foundFriend;
}
}
public class ProfileActivity extends AppCompatActivity {
MyViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mutable_live_data);
if(savedInstanceState != null)
long id = savedInstanceState.getLong("MyLong")
viewModel = new ViewModelProvider(this,ViewModelFactory(application, id)).get(MyViewModel.class);
viewModel.getFoundFriend().observe(this, new Observer<FriendEntity>() {
@Override
public void onChanged(FriendEntity friendEntity) {
if (friendEntity != null){
String name = friendEntity.getName();
textViewData.setText(name);
}
}
});
}
}
此外,为什么Viewmodel不能观察到它自己的LiveData的变化?
问题是: 使用及其其他功能不是更好吗?
我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac
以及何时使用它,
我试图在下面的代码中找出,为什么当我用新数据填充数据库时,Room的LiveData observable没有给我新的班次。 这是放在我的activity的onCreate方法上的: 这是populateAdapter方法: 我还有以下填充数据库的代码(我使用RxJava在IO线程上完成这项工作,因为Room需要在主线程之外调用它的代码): 当我开始观察ShiftsViewModel之后调用per
我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法