标签: android-architecture-components

ViewModel是否能够在活动保存和恢复后生存?

ViewModel如果以下列方式使用,新类的实例可以在配置更改后继续存在:

mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时.

ViewModel在保存还原方案中,是否会保留字段内的值?


编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous

android viewmodel view-model-pattern android-viewmodel android-architecture-components

14
推荐指数
2
解决办法
5886
查看次数

如何在WorkManager for Android中创建具有参数的Worker?

Android架构有一个新的组件WorkManager.

例子中,

class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {

    override fun doWork(): Result {

        // Do the work here--in this case, compress the stored images.
        // In this example no parameters are passed; the task is
        // assumed to be "compress the whole library."
        myCompress()

        // Indicate success or failure with your return value:
        return Result.SUCCESS

        // (Returning RETRY tells WorkManager to try this task again
        // later; FAILURE says not to …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components android-workmanager

14
推荐指数
2
解决办法
6019
查看次数

AppCompatActivity未实现LifecycleOwner

我正在使用Android支持库26.1.0.这些是app模块中的依赖项 -

implementation "android.arch.lifecycle:runtime:1.0.0"
implementation "android.arch.lifecycle:extensions:1.0.0-beta1"
implementation "android.arch.persistence.room:rxjava2:1.0.0-beta1"
implementation "android.arch.lifecycle:common-java8:1.0.0-beta1"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-beta1"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用ViewModel时,如下所示 -

mUserViewModel.getUsers().observe(this,
            (Observer<Resource<List<UserView>>>) listResource -> {
                if(listResource != null){
                    this.handleDataState(listResource.status, listResource.data, listResource.message);
                }
            });
Run Code Online (Sandbox Code Playgroud)

它显示错误,this错误消息是Wrong first argument type Found: packagename.BrowseActivity, required: android.arch.lifecycle.LifecycleOwner.(虽然支持库版本是26.1+已经实现了LifecycleOwner)

我也尝试实现LifecycleRegistryOwner我在此示例中找到的内容,但这也无法正常工作.请提出解决方案,如果我做错了,请告诉我.

编辑1 - 这是Activity类

import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ProgressBar;

import com.github.amitkma.boilerplate.app.R;
import com.github.amitkma.boilerplate.app.mapper.UserMapper;
import com.github.amitkma.boilerplate.app.model.UserModel;
import com.github.amitkma.boilerplate.app.ui.widget.EmptyView;
import com.github.amitkma.boilerplate.app.ui.widget.ErrorView;
import com.github.amitkma.boilerplate.presentation.data.Resource;
import com.github.amitkma.boilerplate.presentation.data.ResourceState;
import com.github.amitkma.boilerplate.presentation.factory.ViewModelFactory;
import …
Run Code Online (Sandbox Code Playgroud)

java android android-architecture-lifecycle android-architecture-components

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

Android PagedList更新

我的问题是如何更新PagedList中的项目?

就我而言,有ListActivity和DetailsActivity.列表活动正在使用Paging组件从网络(仅)获取帖子,并使用分页适配器在回收站视图中显示它.当用户按某些帖子时,我需要获取帖子详细信息并在DetailsActivity上显示.我正在向服务器发出另一个请求,它会返回我的帖子详细信息.在该调用之后,服务器增加该帖子的viewsCount值,当用户返回帖子列表时,我需要在列表项中更新该计数器.

问题是,如何在该PagedList中更新单个项目(post),因为我不需要从头开始重新加载所有列表只是为了更新单个项目.

android android-architecture-components

13
推荐指数
2
解决办法
2450
查看次数

Android onBackPressed处理新的导航组件

我需要一些建议;

我正在试验导航库.我有一个有webView的片段.我想检查它canGoBack是否可以这样做,否则不会干扰.

1.接口方法:由于Navigation正在处理事务,我不再手动创建片段的实例,我可以将其指定为活动中的监听器.

1.重点聆听:我认为它看起来很难看,我不认为这是一个通用的解决方案,所以我跳过这个.

关于如何使用导航库,我需要一些意见.当你试图从中获取currentDestinationnavController,它的NavigationDestination对象提供有关当前片段的信息,例如xml中给出的标签.

当我检查时fragmentManager,我发现它backStack是空的并且片段事务发生时没有标记.

恕我直言,它不适合库的概念来进行findFragment某种操作以与当前片段进行某种程度的交互,但我现在似乎无法通过它找到方法.有什么建议 ?

android android-fragments kotlin android-architecture-components android-architecture-navigation

13
推荐指数
2
解决办法
2948
查看次数

WorkManager的OneTimeWorkRequest的重试策略/机制是什么

我有以下一次性工作人员.

// Create a Constraints that defines when the task should run
Constraints constraints = new Constraints.Builder()
        .setRequiredNetworkType(NetworkType.UNMETERED)
        .setRequiresBatteryNotLow(true)
        // Many other constraints are available, see the
        // Constraints.Builder reference
        .build();

OneTimeWorkRequest oneTimeWorkRequest =
        new OneTimeWorkRequest.Builder(SyncWorker.class)
                .setConstraints(constraints)
                .addTag(SyncWorker.TAG)
                .build();
Run Code Online (Sandbox Code Playgroud)

根据https://developer.android.com/topic/libraries/architecture/workmanager

// (Returning RETRY tells WorkManager to try this task again
// later; FAILURE says not to try again.)
Run Code Online (Sandbox Code Playgroud)

我想知道,如果SyncWorker继续回来RETRY,重试策略是WorkManager什么?例如,最大重试次数是WorkManager多少?文档不清楚.

android android-architecture-components android-workmanager

13
推荐指数
2
解决办法
5803
查看次数

无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1

我正在尝试了解 android 中的 ViewModel 和 LiveData 概念。我正在做一个练习项目,但是当我implementation 'androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1'在我的应用程序级别的 gradle 文件中添加一行时,它显示了我

无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1。

我在 google 上搜索了解决方案,我找到了这个答案,它在我只编译 viewmodel 库时有效,但如果我使用与 相同的方法编译扩展库implementation group: 'androidx.lifecycle', name:'lifecycle-extensions-ktx', version: '2.0.0-alpha1',它会显示与上面相同的错误。我也试图找到它的Maven仓库网站在这里,但我并没有对如何编译它的任何信息。

更新

应用级 Build.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "***************"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar']) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-livedata android-viewmodel android-architecture-components

13
推荐指数
2
解决办法
2万
查看次数

如何在 LifecycleObserver 中获取 LifecycleOwner?

我需要在 LifecycleObserver 中获取 LifecycleOwner 以将其传递给 ViewModel 观察者。

这是我的 MainActivity,我是否添加了 LifecycleObserver。

public class MainActivity extends AppCompatActivity implements LifecycleOwner{

    private LifecycleRegistry mLifecycleRegistry;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.container, MainFragment.newInstance())
                    .commitNow();
        }

        mLifecycleRegistry=new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        getLifecycle().addObserver(new MyLifecycleObserver());
    }


    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的观察者,我需要 LifecycleOwner。

public class MyLifecycleObserver implements LifecycleObserver {


    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStartListener(){

        FirebaseMassage.startFirebase();

        MainFragment.massageViewModel.getMassage().observe(/*here I need the LifecycleOwner*/, textMassage -> {
            FirebaseMassage.updateFirebaseMassage(textMassage);
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle android-architecture-components

13
推荐指数
1
解决办法
1万
查看次数

修改Android Paging Architecture库中的PagedList

我目前正在考虑将Paging Architecture库(2.1.0-beta01编写本文时的版本)整合到我的应用程序中.一个组件是允许用户从中删除单个项目的列表.此列表仅限网络,并且使用Room缓存localy没有意义.

PagedList是不可变的,不支持修改.我已经读过有一个列表的副本,该列表被修改并返回,因为新的列表是要走的路.文档说明了相同的内容:

如果您有更精细的更新信号,例如网络API发信号通知对列表中单个项目的更新,则建议将数据从网络加载到内存中.然后通过包装内存中快照的DataSource将该数据呈现给PagedList.每次内存中副本更改时,都会使先前的DataSource无效,并且可以创建包装快照新状态的新数据.

我目前有基本推荐的实现来显示一个简单的列表.我DataSource看起来像这样:

class MyDataSource<SomeItem> : PageKeyedDataSource<Int, SomeItem>() {

    override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, SomeItem>) {
        // Simple load from API and notification of `callback`.
    }

    override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, SomeItem>) {
        // Simple load from API and notification of `callback`.
    }

    override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, SomeItem>) {
        // Simple load from API and notification of `callback`.
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在文档中引用的内存缓存(没有Room并且没有使整个数据集无效)的具体实现如何?

android kotlin android-architecture-components android-paging

13
推荐指数
2
解决办法
3075
查看次数

如何将 ViewModel 与 Repository 连接起来,以便将数据传播到 View(MVVM、Livedata)

我添加了一些代码以使我的问题更清楚。

改造界面:

public interface JsonPlaceHolderAPI {
    public static final String BASE_URL = "https://jsonplaceholder.typicode.com/";

    @GET("todos/{number}")
    Call<ResponseBody> getJsonResponse(@Path("number") String number);
}
Run Code Online (Sandbox Code Playgroud)

存储库:--> fetchResponse() 将 Viewmodel 的 MutableLiveData 作为参数并使用它来更新其值,然后触发 View 更改其 UI。

public class Repository {

    private final JsonPlaceHolderAPI api;

    public Repository() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .build();
        api = retrofit.create(JsonPlaceHolderAPI.class);
    }


    public void fetchResponse(String number, final MutableLiveData<CharSequence> mld){
        final MutableLiveData<CharSequence> ml = new MutableLiveData<>();

        api.getJsonResponse(number).enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    mld.setValue(response.body().string());

                } catch …
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-architecture-components

13
推荐指数
1
解决办法
1万
查看次数