Articles of android architecture components

为什么要为新连接的观察者触发两次LiveData观察者

我对LiveData理解是,它会触发观察者对数据的当前状态变化,而不是一系列历史状态变化的数据。 目前,我有一个MainFragment ,它执行Room写操作,将非删除数据更改为trashed数据 。 我还有另一个TrashFragment ,它观察到了数据的破坏 。 请考虑以下情形。 目前有0个已删除的数据 。 MainFragment是当前活动的片段。 尚未创建TrashFragment 。 MainFragment添加了1个已删除的数据 。 现在,有1个已删除的数据 我们使用导航抽屉,用TrashFragment替换TrashFragment 。 TrashFragment的观察者将首先收到onChanged ,其中包含0个已删除的数据 同样, TrashFragment的观察者将获得onChanged ,其中包含1个已删除的数据 我的期望是,第(6)项不应该发生。 TrashFragment应该只接收最新的已删除数据 ,即1。 这是我的代码 TrashFragment.java public class TrashFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { noteViewModel = ViewModelProviders.of(getActivity()).get(NoteViewModel.class); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { … […]

带有MVP的Android架构组件

谷歌IO 17上发布了新的Android架构组件。 那么我们应该将MVP与架构组件和MVVM一起使用吗? 在Github上的谷歌样本中,他们使用了MVVM模型。 Google Sample

从ViewModel观察LiveData

我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。 现在我想将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从我的数据获取类返回的LiveData对象。 observe方法需要一个LifecycleOwner对象作为第一个参数,但我显然没有在我的ViewModel内部,我知道我不应该保持对ViewModel内部的Activity / Fragment的引用。 我该怎么办?

具有Android Room的可重用通用基类DAO

有没有办法用Android Room创建可重用的通用基类DAO? public interface BaseDao { @Insert void insert(T object); @Update void update(T object); @Query(“SELECT * FROM #{T} WHERE id = :id”) void findAll(int id); @Delete void delete(T object); } public interface FooDao extends BaseDao { … } public interface BarDao extends BaseDao { … } 我无法find实现这一目标的任何方法,而无需声明相同的接口成员并为每个子类编写查询。 在处理大量类似的DAO时,这变得非常乏味……

将LiveData与数据绑定结合使用

随着Android体系结构组件的稳定,我开始将所有基本的ViewModel更新为ViewModel的新实现。 根据我的理解,建议使用LiveData来保存Model类,因为它可以更好地处理生命周期。 我喜欢使用Data Binding因为它使代码在Java / Kotlin方面更加清晰,并且不需要“观察”值更改来更新UI。 但是,如果Model (或ViewModel)扩展BaseObservable而LiveData不扩展,则使用Data Binding的布局仅监视数据更改。 我理解LiveData的主要目标之一LiveData编程方式观察和更新UI,但对于简单的更新, Data Binding非常有用。 这个问题已经报道过( GitHub和Stack Overflow ),并且首先说版本1.0会有它,现在据说这个function正在开发中。 为了同时使用LiveData和Data Binding ,我创建了一个非常简单的类实现,它扩展了BaseObservable : import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.databinding.BaseObservable class ObservableMutableLiveData() : BaseObservable() { private var data: MutableLiveData = MutableLiveData() constructor(data: T) : this() { this.data.value = data } public fun set(value: T) { if (value != data.value) […]

了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数

涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample 。 我查看了代码并出现了一些问题: 我注意到ViewModelModule包含在AppModule中 。 这意味着所有视图模型都被添加到DI图中。 为什么以这种方式完成,而不是为每个Activity / Fragment提供单独的Module ,只为特定的Activity / Fragment提供所需的ViewModel ? 在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将parameter passing给特定的ViewModel ? 或者更好的解决方案是在ViewModel创建一个setter并通过setter设置所需的param?

无法在AppCompatActivity上解析符号ViewModelProviders

嘿我想让我的ViewModel工作,但到目前为止没有运气。 Android Studio显示错误Cannot resolve symbol ‘ViewModelProviders’ 。 我在这个主题上发现的每一个问题都是纠正extends Activity以extends AppCompatActivity ,但我正在扩展正确的问题。 不确定我错过了什么…… 我的代码基于此YouTubevideo MainActivity.java public class MainActivity extends AppCompatActivity implements TileAdapter.TileAdapterOnClickHandler { private BaseViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //set Toolbar Toolbar myToolbar = findViewById(R.id.toolbar); setSupportActionBar(myToolbar); //initialize viewModel viewModel = ViewModelProviders.of(this).get(BaseViewModel.class); BaseViewModel.java public class BaseViewModel extends ViewModel { private Movie[] mMovie; […]

Android Jetpack导航,使用Youtube或Instagram的BottomNavigationView,如正确的后退导航(片段后退堆栈)?

Android Jetpack导航,BottomNavigationView在后退按钮上点击自动片段后栈? 我想要的是,在用户一个接一个地选择多个标签后,用户点击后退按钮应用必须重定向到他/她打开的最后一页。 通过将当前选定的项目保存在ArrayList中,我使用Android ViewPager实现了相同的function。 Android Jetpack导航发布后是否有任何自动后退堆栈? 我想用导航图实现它 activity_main.xml中 navigation.xml 还补充道 bottomNavigation.setupWithNavController(Navigation.findNavController(this, R.id.my_nav_host_fragment)) 我从Levi Moreira那里得到了一个答案如下 navigation.setOnNavigationItemSelectedListener {item -> onNavDestinationSelected(item, Navigation.findNavController(this, R.id.my_nav_host_fragment)) } 但通过这样做只发生了最后打开的片段的实例再次创建。 为BottomNavigationView提供适当的后退导航

如何清除LiveData存储值?

根据LiveData文档 : LiveData类具有以下优点: … 始终是最新数据:如果生命周期再次启动(如从后端堆栈返回到启动状态的活动),它将收到最新的位置数据(如果尚未生成)。 但有时候我不需要这个function。 例如,我在ViewModel中跟随LiveData,在Activity中跟踪Observer: //LiveData val showDialogLiveData = MutableLiveData() //Activity viewModel.showMessageLiveData.observe(this, android.arch.lifecycle.Observer { message -> AlertDialog.Builder(this) .setMessage(message) .setPositiveButton(“OK”) { _, _ -> } .show() }) 现在每次旋转后都会出现旧的对话框。 有没有办法在处理后清除存储的值或者根本没有使用LiveData?

房间试图重新打开已经关闭的数据库

使用Android架构组件中的Room时,在尝试使用Dagger组件访问数据库时收到以下错误: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path) 我使用Dagger版本2.11和Room版本1.0.0-alpha7 。 该错误在版本1.0.0-alpha5上可重现。 初始化数据库并将其注入我的类后,任何尝试通过DAO访问数据库时都会发生此错误。