Tag: android architecture components

如何处理LiveData的错误状态?

在某些情况下,新的LiveData可以用作RxJava的observables的替代品。 但是,与Observable不同的是, LiveData没有错误回调。 我的问题是:我应该如何处理LiveData错误,例如,当它由某个网络资源支持时,由于IOException可能无法检索?

Android架构组件LiveData

我正在尝试使用架构组件来实现一个简单的应用程序。 我可以使用Retrofit2从RestApi服务获取信息。 我可以在各自的Recyclerview中显示信息,当我旋转手机时,一切都按照原样进行。 现在我想过滤一个新types的对象(通过字符串) 有人可以用ViewModel指导我一点,我不知道最好的做法是什么…我正在使用MVVM … 这是我的ViewModel: public class ListItemViewModel extends ViewModel { private MediatorLiveData mList; private MeliRepository meliRepository; /* Empty Contructor. * To have a ViewModel class with non-empty constructor, * I have to create a Factory class which would create instance of you ViewModel and * that Factory class has to implement ViewModelProvider.Factory […]

Android室错误:types转换器无法识别列表的枚举

房间库不识别我为枚举List创建的TypeConverter 。 但是,当我将其更改为枚举的ArrayList它工作正常。 任何人有任何想法,为什么和我能做些什么来使这个工作与List ? (在Kotlin中使用列表更容易,我真的不希望只是因为这个原因转换回ArrayList )。 这是我的代码: 我的模特: @Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: List?) DayOfWeek是一个枚举: enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; val value: Int get() = ordinal + 1 companion object { private val ENUMS = DayOfWeek.values() fun of(dayOfWeek: Int): DayOfWeek { […]

坚持取向变化的对话视野

在我目前的Android项目中,我有一个对话框,从Web服务中检索对象列表,并在列表中显示这些对象。 它有一个问题,但。 web服务(我的控制范围之外)并不是最快的,所以这个过程需要一段时间,用户通常会在这个过程正在进行时改变设备的方向。 现在的方向更改导致原始webservice调用被取消,并创建一个新的,但这不是我应该如何做我知道。 我希望这个对话框能够在方向改变发生时继续从web服务加载,但是我不知道如何做到这一点。 如何挂钩正在进行的调用并在视图(对话框)中显示此状态? 任何建议表示赞赏。 我玩过Android架构组件和kotlins密封类,将视图状态保存在视图所观察的livedata对象中,但是没有find我喜欢的解决方案。 我相信很多开发者使用RxJava来解决这类问题。 这是我唯一的选择吗? 顺便说一句。 目前我在我的项目中使用MVP架构。 编辑 这是我取消工作的地方 – 如果监听器为空,取消(我正在使用kotlin协程): override fun getWorklist() { job = onWorkerThread { val result = repository.getResult().awaitResult() onMainThread { when (result) { is Result.Ok -> listener?.onResult(result.getOrDefault(emptyList())) 😕 job.cancel() // Any HTTP error is Result.Error -> listener?.onHttpError(result.exception) 😕 job.cancel() // Exception while request invocation is […]

使用LiveData和数据绑定

随着Android体系结构组件的稳定,我开始将所有的基本ViewModel更新为ViewModel的新实现。 在我的理解中,建议使用LiveData来保存Model类,因为它更好地处理生命周期。 我喜欢使用Data Binding因为它使得代码在Java / Kotlin方面更加清晰,并且不需要“观察”值更改来更新UI。 然而,如果Model (或ViewModel)扩展了BaseObservable而LiveData则不扩展, LiveData使用Data Binding的布局只能监视数据的变化。 我明白LiveData的主要目标之一是观察和更新用户界面编程,但对于简单的更新, Data Binding是非常有用的。 这个问题已经被报道( GitHub和堆栈溢出 ),首先是说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) { […]

用于ViewModels的自定义半广义工厂

我想创建一个广义的ViewModelProvider.Factory来实例化我的ViewModels class BundledAppFactory(private var bundle: AppParameterBundle) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { Log.d(“Factory”, “Creating ${modelClass.canonicalName}”) Log.d(“Factory”, “${modelClass.canonicalName} has ${modelClass.constructors.size} constructors and ${modelClass.declaredConstructors.size} declaredConstructors”) modelClass.constructors.forEach { Log.d(“Factory”, “Constructor: $it”) } return when { AppViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppParameterBundle::class.java).newInstance(bundle) AppTeamUserViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppTeamUserParameterBundle::class.java).newInstance(bundle) AppTeamUserHuntIdViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppTeamUserHuntIdParameterBundle::class.java).newInstance(bundle) AppStringViewModel::class.java.isAssignableFrom(modelClass) -> modelClass.getDeclaredConstructor(AppStringParameterBundle::class.java).newInstance(bundle) else -> super.create(modelClass) } } } 这些是我的包: open […]

Android体系结构组件:ViewModel在配置更改时返回null

我正在使用pixabay api在kotlin上开发一个图库应用程序,实现Android Architecture组件和改进以与服务器进行交互。 该应用程序工作正常,但是当我改变配置视图模型返回null! 问题是什么 ? interface PhotoApi { @GET(context.getString(R.string.api_key)) fun getPhotos(): Call } 改造设置 object PhotoRetriever { val BASE_URL = “https://pixabay.com/api/” val service: PhotoApi init { val retrofit = Retrofit.Builder().baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()).build() service = retrofit.create(PhotoApi::class.java) } } class MainActivity : AppCompatActivity() { //var photoList: List? = null lateinit var viewModel: MainActivityViewModel override fun onCreate(savedInstanceState: Bundle?) […]

没有调用Android的LiveData.addSource onChanged事件

我正在使用Android Archi + Retrofit + RxAndroid在Kotlin。 我需要从服务器获取响应时更新我的​​数据对象。 但是livedata.addSource的onChanged没有调用。 我从Git代码获取帮助: – https://github.com/shahbazahmed1269/AndroidGithubIssues 这是我在Kotlin的代码: class LoginRepository : BaseRepository() { fun callLoginApi(data: HashMap): LiveData { val liveData: MutableLiveData = MutableLiveData() // val call = mApiService.getLoginUser(data) mApiService.getLoginUser(data) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { user -> liveData.value = user Log.e(“response”, user.toString()) }, { error -> liveData.value = LoginResponse(error = error.localizedMessage) Log.e(“Error”, error.message) […]

我怎样才能代表与Android室的多对多关系?

我怎样才能代表与房间的多对多关系? 例如我有“客人”和“保留”。 预订可以有许多客人和一位客人可以成为许多预订的一部分。 这是我的实体定义: @Entity data class Reservation( @PrimaryKey val id: Long, val table: String, val guests: List<Guest> ) @Entity data class Guest( @PrimaryKey val id: Long, val name: String, val email: String ) 在查看文档时,我遇到了@Relation 。 我发现它真的很混乱。 根据这个我想创建一个POJO并在那里添加关系。 所以,以我的例子,我做了以下 data class ReservationForGuest( @Embedded val reservation: Reservation, @Relation( parentColumn = "reservation.id", entityColumn = "id", entity = […]

单元测试室和LiveData

我目前正在开发一个应用程序使用新的Android架构组件 。 具体来说,我正在实现一个房间数据库,在其中一个查询返回一个LiveData对象。 插入和查询按预期工作,但我有一个问题,使用单元测试测试查询方法。 这是我试图测试的DAO: NotificationDao.kt @Dao interface NotificationDao { @Insert fun insertNotifications(vararg notifications: Notification): List<Long> @Query("SELECT * FROM notifications") fun getNotifications(): LiveData<List<Notification>> } 正如你所看到的,查询函数返回一个LiveData对象,如果我改变这只是一个List , Cursor或基本上无论如何我得到预期的结果,这是数据库中插入的数据。 问题是,以下测试总是失败,因为LiveData对象的值始终为null : NotificationDaoTest.kt lateinit var db: SosafeDatabase lateinit var notificationDao: NotificationDao @Before fun setUp() { val context = InstrumentationRegistry.getTargetContext() db = Room.inMemoryDatabaseBuilder(context, SosafeDatabase::class.java).build() notificationDao = db.notificationDao() } @After […]