该代码适用于pre-oreo设备,但Crashlytics称它在Android 8设备上崩溃
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getAppComponent().inject(this);
binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
java.lang.NullPointerException:尝试在空对象引用上调用虚方法'int android.view.ViewGroup.getChildCount()'
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference
at android.databinding.DataBindingUtil.bindToAddedViews(DataBindingUtil.java:295)
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:279)
at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261)
at com.myapp.MyActivity.onCreate(MyActivity.java:59)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6940)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Run Code Online (Sandbox Code Playgroud) android android-databinding android-8.0-oreo android-8.1-oreo
在之前Lifecycle和之前LiveData,Viewmodel可以很容易地观察到它自己的观察者的变化.这只是订阅Observable*变化并对其做出反应的问题.然后可以使用双向绑定立即对用户的输入做出反应.
在Android Studio Canary中,现在允许绑定到LiveData对象,前提是Binding知道其所有者的生命周期(ViewBinding现在有其他setLifecycle方法),Android Studio Canary信息:
您现在可以将LiveData对象用作数据绑定表达式中的可观察字段.ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用该方法来观察LiveData对象.
但是,Viewmodel文档清楚地说明了:
ViewModel对象可以包含LifecycleObservers,例如LiveData对象.但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(例如LiveData对象)的更改.
(强调我的)
那么,如果ViewModel无法订阅它们,那么如何立即对LiveData更改做出反应呢?
而且,为什么 Viewmodel无法观察到自己的LiveData的变化?
显然,Room无法处理MutableLiveData,我们必须坚持使用LiveData,因为它返回以下错误:
error: Not sure how to convert a Cursor to this method's return type
Run Code Online (Sandbox Code Playgroud)
我用这种方式在我的数据库助手中创建了一个"自定义"MutableLiveData:
class ProfileRepository @Inject internal constructor(private val profileDao: ProfileDao): ProfileRepo{
override fun insertProfile(profile: Profile){
profileDao.insertProfile(profile)
}
val mutableLiveData by lazy { MutableProfileLiveData() }
override fun loadMutableProfileLiveData(): MutableLiveData<Profile> = mutableLiveData
inner class MutableProfileLiveData: MutableLiveData<Profile>(){
override fun postValue(value: Profile?) {
value?.let { insertProfile(it) }
super.postValue(value)
}
override fun setValue(value: Profile?) {
value?.let { insertProfile(it) }
super.setValue(value)
}
override fun getValue(): Profile? {
return profileDao.loadProfileLiveData().getValue()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,我从DB获取更新并可以保存 …
android kotlin android-room android-livedata android-architecture-components
我曾尝试将数据从Worker数据库保存到Room数据库.
版本:
MainActivity.kt
private fun runDataDownloadWork() {
WorkManager.getInstance()
.beginWith(dwElementTypesWork)
.then(dwElementsWork)
.enqueue()
WorkManager.getInstance().getStatusById(dwElementsWork!!.id)
.observe(this, Observer { workStatus ->
if (workStatus != null && workStatus.state.isFinished) {
Log.d("WorkManager", "dwElementsWork finished")
}
})
}
private fun createWorkRequests() {
dwElementsWork = OneTimeWorkRequestBuilder<DWElementsWork>()
.addTag(DWElementsWork.TAG)
.setConstraints(wifiConstraints)
.build()
dwElementTypesWork = OneTimeWorkRequestBuilder<DWElementTypesWork>()
.addTag(DWElementTypesWork.TAG)
.setConstraints(wifiConstraints)
.build()
}
Run Code Online (Sandbox Code Playgroud)
DWElementsWork.kt
class DWElementsWork : Worker() {
companion object {
const val TAG = "dw_elements_work"
}
override fun doWork(): WorkerResult {
val apiService: APIService = ServiceGenerator
.createService(applicationContext, MyAPIService::class.java) …Run Code Online (Sandbox Code Playgroud) 我尝试初始化我的 LiveData 对象,但它给出了错误:“LiveData 是抽象的,无法实例化”
LiveData listLiveData = new LiveData<>();
我在我的存储库中使用了一个 AsyncTask,它用于在存储库中设置 LiveData。如何使用转换从我的 ViewModel 观察这个 LiveData?
android android-asynctask android-livedata android-architecture-components
在应用程序启动时,我想启动将永久工作的服务,但是当用户再次打开应用程序时,它会重复.
PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
.setConstraints(new Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build());
PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
.build();
WorkManager.getInstance().enqueue(periodicWorkRequest);
Run Code Online (Sandbox Code Playgroud) 我一直在探索 android 的架构组件。我不确定是否可以将架构组件与小部件生命周期一起使用。我浏览了很多,但没有可用的信息,如果我们可以使用LiveData和其他架构组件,如带有小部件的 View-Model?如果是,那么这样做的正确方法是什么?
所以我有一个简单的实现来在 a 中显示用户列表RecyclerView,并在ViewModelas 中查询该列表LiveData。
问题是 UI 没有更新以显示最新的列表 - 称为users- 即使观察到该列表。我现在只是设置了一个演示用户列表。
这是我的视图模型:
class MainViewModel : ViewModel() {
private val demoData = listOf(
User(userName = "Bob", favoriteColor = "Green"),
User(userName = "Jim", favoriteColor = "Red"),
User(userName = "Park", favoriteColor = "Blue"),
User(userName = "Tom", favoriteColor = "Yellow"),
User(userName = "Lee", favoriteColor = "Black"),
User(userName = "Xiu", favoriteColor = "Gray")
)
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>>
get() = _users
init {
_users.value …Run Code Online (Sandbox Code Playgroud) android kotlin android-recyclerview android-livedata android-jetpack
我有一个休息api,它返回一个地方列表,其中包含一个类别列表:
{
"id": "35fds-45sdgk-fsd87",
"name" : "My awesome place",
"categories" : [
{
"id": "cat1",
"name" : "Category 1"
},
{
"id": "cat2",
"name" : "Category 2"
},
{
"id": "cat3",
"name" : "Category 3"
}
]
}
Run Code Online (Sandbox Code Playgroud)
因此,使用改造我从远程服务器获取这些模型类:
data class Category(var id: String, var name: String)
data class Place(
var id: String,
var name: String,
var categories: List<Category>
)
Run Code Online (Sandbox Code Playgroud)
问题是 - 我希望viewModel始终从返回Flowables的本地Room数据库中检索,并且只触发将更新数据库以及视图的刷新操作.
DAO方法示例:
@Query("select * from Places where placeId = :id")
fun getPlace(id: String): Flowable<Place>
Run Code Online (Sandbox Code Playgroud)
所以我尝试像这样建模这两个类:
@Entity
data class …Run Code Online (Sandbox Code Playgroud) android ×10
android-architecture-components ×4
android-room ×3
kotlin ×3
binding ×1
mvvm ×1
retrofit ×1
rx-java2 ×1