我正在使用 google android 架构组件,并且我有一个前台服务,它是 LifeCycleService。
问题是当我尝试从我的存储库观察 LiveData 时,可观察的 onChanged 不会触发。如果我使用observeForever而不是observe它会触发。
什么会导致这样的问题?
service lifecycle android android-lifecycle android-livedata
有没有办法用 LiveData 和数据绑定来做这样的事情?
ViewModel 有这个属性:
val weather: LiveData<UnitSpecificCurrentWeatherEntry>
Run Code Online (Sandbox Code Playgroud)
我想在布局中做什么:
<TextView
android:id="@+id/textView"
android:text="@{viewmodel.weather.value.someProperty}"... />
Run Code Online (Sandbox Code Playgroud)
这是否可以以任何方式实现,或者我是否必须针对所包含对象的每个属性将 LiveData 中包含的对象拆分为多个对象?
MutableList将 a 包装在LiveDataor中的建议方法是什么MutableLiveData,以便可以修改列表并观察它所发生的变化?
我在 Room 中有一些相当短的表(<20 个项目)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作其他更大表的查询中的过滤器。我的想法是将 a 分配给我的应用程序中的模型类,并通过将此类包装在或 中MutableList来使其可观察。然后,通过更新这些选择中的项目,我可以触发大型表上的必要查询。MutableLiveDataLiveData
目前我的代码具有以下结构,我已在问题中将其精简为我认为相关的内容。最终我想keyset在更复杂的查询中使用多个。我的简化模型文件如下,
class Model(application : Application) : AndroidViewModel(application)
{
val keys : LiveData<List<Key>>
val keyset : LiveData<MutableList<Key>>
val values : LiveData<List<Value>>
init {
keys = repository.keys
values = repository.values
keyset = mutableListOf<Key>() // I'm not entirely sure how to instantiate LiveData<MutableList<Key>>
}
}
Run Code Online (Sandbox Code Playgroud)
它依赖于存储库,
class Repository(private val queryset : QuerySet)
{
val keys : LiveData<List<Key>> = queryset.getKeys()
val values : …Run Code Online (Sandbox Code Playgroud) 考虑以下简单设置。1 个片段与 1 个 ViewModel:
分段
class TestFragment : Fragment() {
private val viewModel by lazy {
ViewModelProviders.of(this).get(TestViewModel::class.java)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_test, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.testLiveData.observe(viewLifecycleOwner, androidx.lifecycle.Observer {
Log.d("###", "whattt")
})
}
}
Run Code Online (Sandbox Code Playgroud)
视图模型
class TestViewModel : ViewModel() {
private val myVariable = Log.d("###", "Test")
val testLiveData = MutableLiveData(false)
}
Run Code Online (Sandbox Code Playgroud)
为什么我从 Fragment 和 ViewModel 获得最多三倍的日志输出?
D/###: Test
D/###: whattt
D/###: Test
D/###: …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-viewmodel android-architecture-components
Android数据绑定不观察kotlin的liveData构建器
以下代码将创建一个 LiveData,并且应该通过数据绑定来观察它,XML但它不起作用
val text =
liveData(Dispatchers.Default) {
emit("Hello")
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果它被观察到Kotlin它工作得很好
vm.text.observe(lifeCycleOwner,{
binding.texti.text = it
})
Run Code Online (Sandbox Code Playgroud)
xml:
val text =
liveData(Dispatchers.Default) {
emit("Hello")
}
Run Code Online (Sandbox Code Playgroud)
如果我将实时数据的定义更改为:
val text = MutableLiveData("Hello")
Run Code Online (Sandbox Code Playgroud)
数据绑定自动观察并设置文本
是我做错了还是bug?
RecyclerView我的里面有ViewPager一个Fragment。此RecyclerView显示从服务器获取的数据。它通常可以工作,但我无法使用ViewModel和实现相同的功能LiveData,因为当从 更改时,该livedata.observe方法不会被调用。livedataViewModel
这是我的MonthlyOrderViewModel.java类的源代码
public class MonthlyOrderViewModel extends AndroidViewModel {
private Retrofit retrofit;
private RetrofitServices retrofitServices;
private MutableLiveData<MonthlyOrderHistory> monthlyOrderHistoryMutableLiveData = new MutableLiveData<>();
public MonthlyOrderViewModel(@NonNull Application application) {
super(application);
retrofit = RetrofitFactory.getRetrofit();
retrofitServices = retrofit.create(RetrofitServices.class);
}
public MutableLiveData<MonthlyOrderHistory> getMonthlyOrderHistoryMutableLiveData() {
return monthlyOrderHistoryMutableLiveData;
}
public void fetchMonthlyOrders() {
Call<MonthlyOrderHistory> call = retrofitServices.getAllMonthlyOrderHistory(IpharmaApplication.getInstance().getLoggedInUser().getId());
call.enqueue(new Callback<MonthlyOrderHistory>() {
@Override
public void onResponse(Call<MonthlyOrderHistory> call, Response<MonthlyOrderHistory> response) {
MonthlyOrderHistory monthlyOrderHistory = response.body(); …Run Code Online (Sandbox Code Playgroud) 我livedata在 viewpager 中的 Fragment 中使用 。我观察 liveDataonActivityCreated()并在列表中显示数据。到目前为止一切顺利,我没有任何问题。另一方面,当我将应用程序置于后台并返回到 viewpager 的任何页面时,会Observer再次调用,我不明白为什么!请帮助我理解。我什至没有浏览onResume()相关片段。
我创建了一个基本示例,其中的活动是通过 LiveData 观察房间数据库。欲了解更多信息,请查看以下代码:
@Dao
interface NoteDao {
@Query("SELECT * FROM note ORDER BY date_created DESC")
fun getAll(): LiveData<List<Note>>
}
// Repository
class ReadersRepository(private val context: Context) {
private val appDatabase = Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
.build()
fun getAllNotes(): LiveData<List<Note>> {
return appDatabase.getNoteDao().getAll()
}
}
// ViewModel
class AllNotesViewModel(application: Application) : AndroidViewModel(application) {
private val repository = ReadersRepository(application)
internal var allNotesLiveData: LiveData<List<Note>> = repository.getAllNotes()
}
// Activity
class MainActivity : BaseActivity<AllNotesViewModel>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
viewModel.allNotesLiveData.observe(this, Observer …Run Code Online (Sandbox Code Playgroud) 我有一个ViewModel具有 type 属性的属性LiveData<UserData>,正在从 Room 数据库中读取。
其代码如下:
class UserDataViewModel(application: Application) : AndroidViewModel(application) {
private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
val userData: LiveData<UserData?> = userDataDao.getUserData()
}
Run Code Online (Sandbox Code Playgroud)
在关联的活动中,我获得了对视图模型的引用:
private val viewModel: UserDataViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
UserData在该活动中,我需要获取按钮单击的值:
private fun handleClick(view: View) {
viewModel.userData.value?.let {
// do stuff if the userData is present
}
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,除非用户在加载数据之前按下按钮,否则它永远不应该为空。
然而,正如代码所示,对的调用viewModel.userData.value始终为空,并且该let块永远不会执行。
但是,如果我在 中添加此语句onCreate,let单击处理程序中的块将根据需要执行:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.userData.observe(this, Observer {
// do nothing …Run Code Online (Sandbox Code Playgroud) android android-lifecycle kotlin android-room android-livedata
我在项目中使用 Android Jetpack 组件 ViewModel + 实时数据之一,当使用字符串和 Int 等普通数据时,它对我来说效果很好,但当涉及到 arrayList 时,它不会观察到任何内容
这是我的代码
class MainActivityModel : ViewModel() {
private var dataObservable = MutableLiveData<ArrayList<Int>>()
init {
dataObservable.value = arrayListOf(1,2,3,4,5)
}
fun getInt(): LiveData<ArrayList<Int>> = dataObservable
fun addInt(i:Int) {
dataObservable.value!![i] = dataObservable.value!![i].plus(1)
}
}
Run Code Online (Sandbox Code Playgroud) android-livedata ×10
android ×9
kotlin ×6
android-room ×2
android-architecture-components ×1
data-binding ×1
lifecycle ×1
mutablelist ×1
observers ×1
service ×1