标签: android-architecture-components

我应该将 viewModelScope.coroutineContext 传递给 liveData 构建器函数吗?

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

4
推荐指数
1
解决办法
2495
查看次数

如何使用安全参数传递“位图”作为参数

我想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

4
推荐指数
1
解决办法
1792
查看次数

喷气背包中的状态持有者组成

我正在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

4
推荐指数
1
解决办法
2532
查看次数

使用Android的新架构组件,saveInstanceState是否重要?

阅读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与新架构无关吗?

android android-architecture-components

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

在AndroidViewModel中获取FragmentManager

AndroidViewModel用于访问Application上下文.我试图在没有明确传递ActivityFragmentManager情况下访问它:

class FooViewModel(app: Application) : AndroidViewModel(app) {
  private val fm = (app.applicationContext as Activity).fragmentManager
  ..
}
Run Code Online (Sandbox Code Playgroud)

得到错误,无法投射ContextActivity.


问题:有没有办法进入FragmentManager内部AndroidViewModel而不明确地传递它?

android android-fragments kotlin fragmentmanager android-architecture-components

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

Android LiveData Observer在首次更新后无效

我正在尝试使用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

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

从ViewModel访问strings.xml

我正在使用Dagger 2 DataBindng和新的Android Lifecycle组件,这些组件具有ViewModels

在我的内部,ViewModel如何访问我的strings.xml?我在想,在第一,注入ContextviewModel,然而,这只会泄漏内存。

还有其他方法吗?

android android-context dagger-2 android-viewmodel android-architecture-components

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

Android Live数据观察者异常

我正在尝试实现新的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

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

Room Android - 如何处理数据库版本升级

我正在阅读关于Android架构组件的房间,并想知道Room中是否存在与SQLiteOpenHelper中可用的onUpgrade方法等效的内容 -

@Override public void onUpgrade(最终的SQLiteDatabase数据库,final int oldVersion,final int newVersion){}

谢谢,RS.

android android-room android-architecture-components

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

android的ViewModel的奇怪行为

当我尝试通过在每次离开活动并返回时在开发人员选项中启用“不要保留活动”来模拟应用程序中的配置更改时,将ViewModel重新创建该活动!不ViewModels应该处理这些情况吗?

我可以通过保存活动状态来解决此问题,onSaveInstanceState但是使用a的意义ViewModel何在?

android android-viewmodel android-architecture-components

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