标签: android-architecture-components

我很少发生无法从 onDestroy 访问 ViewModel

启动应用程序后我收到了这样的错误,这种情况很少发生。

这是我完整的 Java 堆栈跟踪相关联:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.mycompany.myapp.dev, PID: 11145
              java.lang.IllegalStateException: Can't access ViewModels from onDestroy
                  at android.arch.lifecycle.HolderFragment$HolderFragmentManager.findHolderFragment(HolderFragment.java:136)
                  at android.arch.lifecycle.HolderFragment$HolderFragmentManager.holderFragmentFor(HolderFragment.java:155)
                  at android.arch.lifecycle.HolderFragment.holderFragmentFor(HolderFragment.java:81)
                  at android.arch.lifecycle.ViewModelStores.of(ViewModelStores.java:42)
                  at android.arch.lifecycle.ViewModelProviders.of(ViewModelProviders.java:88)
                  at com.mycompany.myapp.ui.splash.SplashActivity$viewModel$2.invoke(SplashActivity.kt:47)
                  at com.mycompany.myapp.ui.splash.SplashActivity$viewModel$2.invoke(SplashActivity.kt:40)
                  at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:130)
                  at com.mycompany.myapp.ui.splash.SplashActivity.getViewModel(SplashActivity.kt:0)
                  at com.mycompany.myapp.ui.splash.SplashActivity$onResume$1.run(SplashActivity.kt:62)
                  at android.os.Handler.handleCallback(Handler.java:815)
                  at android.os.Handler.dispatchMessage(Handler.java:104)
                  at android.os.Looper.loop(Looper.java:207)
                  at android.app.ActivityThread.main(ActivityThread.java:5805)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Run Code Online (Sandbox Code Playgroud)

这是我的代码,但很奇怪,因为我没有设置 onDestroy()

class SplashActivity : AppCompatActivity(){
    GoogleApiClient.OnConnectionFailedListener {
    val context = this

    val viewModel by lazy {
        ViewModelProviders.of(this).get(ListModel::class.java)
    }

    override fun onResume() {
        super.onResume()

        Handler().postDelayed(object: Runnable{
            override …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components

3
推荐指数
1
解决办法
2258
查看次数

如何在主线程上的 onCreate/ 中获取房间列表的大小?

如何轻松获得数据库大小的计数,以便我可以根据数据库是否为空执行适当的操作?

我有一个 App DB、视图模型、存储库、Dao 和所有其他部分,并且我的对象插入......但我无法调用onCreate()数据库中列表的大小。当我尝试获取mAppDatabase.vehicleDao().getAll().getValue().size(), 或 时mVehicleViewModel.getAll().getValue().size(),我得到空指针异常。

但是我知道我的对象正在插入,因为当我运行一个 observable 时,我可以记录它们的信息......但我无法在主线程/onCreate 中获得计数。帮助!示例代码如下:

protected void onCreate(Bundle savedInstanceState) {
...
mAppDatabase = AppDatabase.getInstance(MyActivity.this);
Log.d("LISTSIZEAPP", String.valueOf(mAppDatabase.myDao().getAll().getValue().size()));
ObserveItems();
Run Code Online (Sandbox Code Playgroud)

或者

protected void onCreate(Bundle savedInstanceState) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Log.d("LISTSIZEVM",  String.valueOf(mViewModel.getAll().getValue().size()));
ObserveItems();
Run Code Online (Sandbox Code Playgroud)

^ 两者的空指针异常(尝试在空对象引用上调用接口方法 'java.lang.Object[] java.util.List.toArray()')...

然而:

private void ObserveItems() {
    mViewModel.getAll().observe(this, new Observer<List<Foo>>() {
        @Override
        public void onChanged(@Nullable final List<Foo> foos) {
            mFoos= foos;
            for (Vehicle v: mFoos) {
                Log.d("ROOM INFO - FOOS", v.getFooTitle());
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我可以记录我想要的所有信息。所以这些项目是明确插入的。是什么赋予了?我错过了什么?谢谢你。

java android android-room android-architecture-components android-jetpack

3
推荐指数
1
解决办法
6139
查看次数

如何从 Worker 类中获取 ViewModel?

  1. 我的Activivity应用程序中有一个名为 MainActivity 的应用程序。
  2. MainActivity 与ViewModelOnCreate 方法中的a 相关联

    ...
    val someViewModel = ViewModelProviders.of(this).get(SomeViewModel::class.java)
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我做了一些背景工作Workers

    val someWork = OneTimeWorkRequestBuilder<LoginWorker>().build() WorkManager.getInstance().beginUniqueWork("SOMEWORK", ExistingWorkPolicy.REPLACE, captivePortalWork).enqueue()

  4. 问题来了……worker例如,循环 10 次,每次只睡一秒钟……所以我们有 10 秒的后台工作。我想更新ViewModel以显示后台工作的进度并每次更新UI。

    A) 我可以从 MainActivity 访问 View 模型并观察worker但我只能ViewModel在进度成功或失败时更新...这意味着我可以在工作完成 0 或 100% 时显示进度。

    B) 如果我可以从 Worker 类访问 ViewModel,我可以随时更新 ViewModel。但我不知道如何......这个方法在 Worker 类中不起作用。

    val someWork = ViewModelProviders.of(this).get(SomeViewModel::class.java)

    我怎样才能ViewModelWorker课堂上获得一个?

android android-viewmodel android-architecture-components android-workmanager

3
推荐指数
2
解决办法
4621
查看次数

Room - 字符串类型转换器数组

有没有人将数组类型的类型转换器作为逗号分隔的字符串列表存储在 Room 数据库中?

谢谢帮助

android android-room android-architecture-components

3
推荐指数
1
解决办法
3467
查看次数

如何使用导航控制器设置导航抽屉并处理单个菜单项

我想让大部分菜单项由导航组件的控制器处理,但我也想单独处理一个“注销”菜单项,如下所示:

val navController = findNavController(R.id.nav_host_fragment)
        nav_view.setNavigationItemSelectedListener { item ->
            when(item.itemId) {
                R.id.logout_menu_item -> {
                    Toast.makeText(context, "Logut Menu Item Touched", Toast.LENGTH_LONG).show()
                    true
                }
                else -> false
            }
        }
        nav_view.setupWithNavController(navController)
        bottom_navigation.setupWithNavController(navController)
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用,以及如何解决此问题?

android navigation-drawer android-navigation android-architecture-components

3
推荐指数
1
解决办法
526
查看次数

在 Viewpager 中使用具有相同 ViewModel 的相同 Fragment 的多个实例时出现问题

我有一个带有视图模型 (VM1) 的片段 (FRAG1)。我正在 FragmentPagerAdapter 中创建此片段的两个新实例以加载到 ViewPager 中。

Viewpager 存在于父 Fragment 中。

两个片段实例中的 ViewModels 似乎都不是唯一的。两个片段实例似乎都具有在最后初始化的第二个片段中创建的 ViewModel 实例的属性。

private inner class ItDeclarationFragAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm)
{
    override fun getItem(position: Int): Fragment
    {
        return when (position)
        {
            0 -> ITDeclarationSummaryFragment.newInstance(false)
            1 -> ITDeclarationSummaryFragment.newInstance(true)

            else -> ITDeclarationSummaryFragment.newInstance(false)
        }
    }

    override fun getCount(): Int
    {
        return 2
    }

    override fun getPageTitle(position: Int): CharSequence?
    {
        return when (position)
        {
            0 -> resources.getString(R.string.zpl_itDeclaration_tile)
            1 -> resources.getString(R.string.zpl_itDeclaration_poi_title)

            else -> resources.getString(R.string.zpl_reimbursements_summary)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Fragment 在 OnCreate() 中创建新创建的 …

android android-fragments android-viewpager android-viewmodel android-architecture-components

3
推荐指数
1
解决办法
1862
查看次数

E/SQLiteLog: (283) 从 WAL 文件中恢复的帧

每次启动应用程序时都会出现错误。

E/SQLiteLog: (283) recovered 22 frames from WAL file /data/data/com.dmitrysimakov.kilogram/databases/androidx.work.workdb-wal
Run Code Online (Sandbox Code Playgroud)

该应用程序工作正常,但我想知道为什么会出现此错误。database/androidx.work.workdb-wal 它是 Worker 的日志。我使用 Worker 来预填充我的数据库。

Room.databaseBuilder(app, KilogramDb::class.java, "kilogram.db")
            .addCallback(object : RoomDatabase.Callback() {
                override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)
                    val request = OneTimeWorkRequestBuilder<SeedDatabaseWorker>().build()
                    WorkManager.getInstance().enqueue(request)
                }
            })
            .fallbackToDestructiveMigration()
            .build()
Run Code Online (Sandbox Code Playgroud)

android android-sqlite android-architecture-components android-workmanager

3
推荐指数
1
解决办法
3151
查看次数

Room + LiveData 动态变更查询功能

我正在制作一个应该更新当前列表的应用程序。实现是使用 room 和 livedata 完成的,我使用的是没有 viewmodel 的 mvp 模式。我的问题是,如果我有一个查询返回所选类别中的所有项目,并且我在 livedata 上已经有一个可观察对象,我是否可以使用不同的查询参数更改 dao 函数并相应地更新列表。我发现的最接近它的是: Android Room LiveData select query parameters

但由于我对开发相对较新,并且目前正在探索 android 中的反应式范例,这已被证明是一个相当大的挑战。

在主持人

override var itemsList: LiveData<List<Item>?> = 
itemDao.getItemsForCategory(1)
Run Code Online (Sandbox Code Playgroud)

在主要活动中

presenter.itemsList.observe(this, Observer {
    if (it != null) {
        itemAdapter.setTodoItems(it)
        itemListHolder.adapter =itemAdapter
    }
})
Run Code Online (Sandbox Code Playgroud)

在道

@Query("SELECT * FROM Item")
fun getItemsFromDatabase(): LiveData<List<Item>?>

@Query("SELECT * FROM Item WHERE category_id == :category_id ORDER BY 
creationTime ASC")
fun getItemsForCategory(category_id: Long): LiveData<List<Item>?>
Run Code Online (Sandbox Code Playgroud)

编辑(解决方案)

解决方案是 mutableLiveData,其中值更改查询参数:

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
    itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override …
Run Code Online (Sandbox Code Playgroud)

kotlin android-room android-livedata android-architecture-components

3
推荐指数
1
解决办法
1718
查看次数

房间日历类型转换器 (Kotlin)

我正在尝试使用以下方法在我的房间数据库中保留时间戳TypeConverter

class Converters {

    @TypeConverter
    fun fromTimestamp(value: Long?): Calendar? {

        if(value == null) return null

        val cal = GregorianCalendar()
        cal.timeInMillis = value
        return cal
    }

    @TypeConverter
    fun toTimestamp(timestamp: Calendar?): Long? {

        if(timestamp == null) return null

        return timestamp.timeInMillis
    }
}
Run Code Online (Sandbox Code Playgroud)

我的两个实体包括以下列:

@ColumnInfo(name = "timestamp")
val timestamp: Calendar?,
Run Code Online (Sandbox Code Playgroud)

但是在尝试构建项目时出现编译错误 - 在使用Date TypeConverter开发人员参考指南中的示例时我没有遇到任何问题。

我无法看到实际的错误是什么,因为如果与 Room 相关的代码有问题,我只会收到一堆数据绑定“找不到符号”错误。

sqlite typeconverter kotlin android-room android-architecture-components

3
推荐指数
1
解决办法
4561
查看次数

如何使用可能的待处理意图从服务导航到导航片段?

我正在尝试从我的通知中打开一个带有 args 的片段。实际上,就我而言,我的音频播放器与带有通知的前台服务一起运行,现在我想通过在用户单击通知时传递音频 ID 来导航到该特定音频的片段。

android mvvm android-architecture-components android-architecture-navigation navigation-architecture

3
推荐指数
1
解决办法
2765
查看次数