viewModelScope用于将协程生命周期绑定到ViewModel生命周期。liveData构建器创建一个LiveData运行协程的 ,其生命周期与状态绑定LiveData,因此,当LiveData不活动时,协程会在超时后取消。由于超时,协程不会在配置更改时被取消。
如果我在 a 内创建一个LiveDatavia构建器,并观察到,生命周期已经绑定到生命周期。我还应该将其传递给构建者吗?我认为我不应该,但在 Android 文档示例之一中它通过了:liveDataViewModelLiveDataActivityLiveDataActivityviewModelScope.coroutineContextliveData
class MyViewModel: ViewModel() {
private val userId: LiveData<String> = MutableLiveData()
val user = userId.switchMap { id ->
liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) {
emit(database.loadUserById(id))
}
}
}
Run Code Online (Sandbox Code Playgroud) android android-livedata android-viewmodel android-architecture-components kotlin-coroutines
我想Bitmap使用安全参数将参数传递给另一个片段。argType传递位图的正确方法是什么?
<fragment
android:id="@+id/nextFragment"
android:name="com.example.----.NextFragment"
android:label="fragment_next"
tools:layout="@layout/fragment_next" >
<argument
android:name="image"
app:argType="???"
android:defaultValue="???" />
</fragment>
Run Code Online (Sandbox Code Playgroud) android android-architecture-components android-jetpack android-architecture-navigation android-safe-args
我正在State学习jetpack compose。我发现国家持有者是真相的来源。所以创建了我的一些数据,如果我在这里做错了,你们可以指导我吗?
PairViewModel.kt
class PairViewModel : ViewModel() {
var isBluetoothEnabled = mutableStateOf(false)
private set
fun onBluetoothEnable(value: Boolean) {
isBluetoothEnabled.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
配对屏幕.kt
class PairScreenState(context: Context, viewModel: PairViewModel) {
private val bluetoothManager: BluetoothManager = context.getSystemService(BluetoothManager::class.java)
private val bluetoothAdapter: BluetoothAdapter by lazy {
bluetoothManager.adapter
}
init {
viewModel.onBluetoothEnable(bluetoothAdapter.isEnabled)
}
fun checkBluetoothStatus(bluetoothStatus: MutableState<Boolean>): BroadcastReceiver {
return object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == BluetoothAdapter.ACTION_STATE_CHANGED) {
when (intent.getIntExtra(
BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR
)) …Run Code Online (Sandbox Code Playgroud) android kotlin android-architecture-components android-jetpack android-jetpack-compose
阅读Android的新架构组件,建议使用各种ViewModel实例将数据提供给Activities和Fragments.
还有一种从单个持久模型驱动数据的概念:
第二个重要原则是您应该从模型驱动UI,最好是持久模型.持久性是理想的两个原因:如果操作系统破坏您的应用程序以释放资源,您的用户将不会丢失数据,即使网络连接不稳定或未连接,您的应用程序也将继续工作.模型是负责处理应用程序数据的组件.它们独立于应用程序中的视图和应用程序组件,因此它们与这些组件的生命周期问题隔离开来.
一个类似的单一事实来源的概念:
在此模型中,数据库充当单一事实来源,应用程序的其他部分通过存储库访问它.无论您是否使用磁盘缓存,我们都建议您的存储库将数据源指定为应用程序其余部分的唯一真实来源.
在我看过的代码示例中,它们确实将savedInstanceState包传递给超类的实现,例如:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String userId = getArguments().getString(UID_KEY);
viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class);
viewModel.init(userId);
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎我们的活动没有理由将任何重要值显式存储/保存到savedInstanceState中.
savedInstanceState与新架构无关吗?
AndroidViewModel用于访问Application上下文.我试图在没有明确传递Activity的FragmentManager情况下访问它:
class FooViewModel(app: Application) : AndroidViewModel(app) {
private val fm = (app.applicationContext as Activity).fragmentManager
..
}
Run Code Online (Sandbox Code Playgroud)
得到错误,无法投射Context到Activity.
问题:有没有办法进入FragmentManager内部AndroidViewModel而不明确地传递它?
android android-fragments kotlin fragmentmanager android-architecture-components
我正在尝试使用Kotlin对Architecture Component的实时数据进行基本实现,如下所示:
class MarketFragment : LifecycleFragment(){
......
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel=ViewModelProviders.of(this).get(MarketViewModel::class.java)
viewModel.book?.observe(this, Observer { book-> //updateUI })
....
Run Code Online (Sandbox Code Playgroud)
我的ViewModel类是这样创建的:
class MarketViewModel : ViewModel()
{
var book: MutableLiveData<Book>? =MutableLiveData()
var repository: Repository?= Repository()
init {
update("parameter")
}
fun update(s: String)
{
book=repository?.getBook(s)
}
}
Run Code Online (Sandbox Code Playgroud)
和我的存储库:
fun getBook(bookSymbol:String):MutableLiveData<Book>
{
val book=MutableLiveData<Book>()
......
call . enqueue (object : Callback<Book> {
override fun onResponse(call: Call<Book>?, response: Response<Book>?) {
book.value=response?.body()
}
.....
})
return book
}
Run Code Online (Sandbox Code Playgroud)
}
所有这些都很有效,UI应该更新,但只是第一次.如果我尝试进行手动调用以从UI操作更新viewModel,则改装调用仍然按预期工作,但新数据不会发送到片段中的Observer:
//this doesn't work:
viewModel.update("string") …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-architecture-components
我正在使用Dagger 2 DataBindng和新的Android Lifecycle组件,这些组件具有ViewModels。
在我的内部,ViewModel如何访问我的strings.xml?我在想,在第一,注入Context到viewModel,然而,这只会泄漏内存。
还有其他方法吗?
android android-context dagger-2 android-viewmodel android-architecture-components
我正在尝试实现新的android体系结构组件并在片段和视图模型中使用实时数据,但是当我向实时数据添加观察者时,应用程序崩溃抛出此异常.
Process: com.nrs.nsnik.architecturecomponents, PID: 3071
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.nrs.nsnik.architecturecomponents/com.nrs.nsnik.architecturec
omponents.view.MainActivity}: java.lang.ClassCastException: android.arch.lifecycle.LiveData_LifecycleBoundObserver_LifecycleAdapter cannot be cast to android.arch.lifecycle.GeneratedAdapter
.
.
.
.
Caused by: java.lang.ClassCastException: android.arch.lifecycle.LiveData_LifecycleBoundObserver_LifecycleAdapter cannot be cast to android.arch.lifecycle.GeneratedAdapter
Run Code Online (Sandbox Code Playgroud)
列表片段:
public class ListFragment extends Fragment {
@BindView(R.id.listFragmentRecyclerView)
RecyclerView mRecyclerView;
@BindView(R.id.listFragmentAddItem)
FloatingActionButton mFloatingActionButton;
private Unbinder mUnbinder;
private CompositeDisposable mCompositeDisposable;
private ListViewModel mListViewModel;
private List<NoteEntity> mNoteEntityList;
private ListAdapter mListAdapter;
private NoteDatabase mNoteDatabase;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_list, container, false);
mUnbinder …Run Code Online (Sandbox Code Playgroud) android android-sqlite android-livedata android-viewmodel android-architecture-components
我正在阅读关于Android架构组件的房间,并想知道Room中是否存在与SQLiteOpenHelper中可用的onUpgrade方法等效的内容 -
@Override public void onUpgrade(最终的SQLiteDatabase数据库,final int oldVersion,final int newVersion){}
谢谢,RS.
当我尝试通过在每次离开活动并返回时在开发人员选项中启用“不要保留活动”来模拟应用程序中的配置更改时,将ViewModel重新创建该活动!不ViewModels应该处理这些情况吗?
我可以通过保存活动状态来解决此问题,onSaveInstanceState但是使用a的意义ViewModel何在?
android ×10
android-architecture-components ×10
kotlin ×3
android-architecture-navigation ×1
android-room ×1
dagger-2 ×1