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
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
我正在使用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
我的问题是如何更新PagedList中的项目?
就我而言,有ListActivity和DetailsActivity.列表活动正在使用Paging组件从网络(仅)获取帖子,并使用分页适配器在回收站视图中显示它.当用户按某些帖子时,我需要获取帖子详细信息并在DetailsActivity上显示.我正在向服务器发出另一个请求,它会返回我的帖子详细信息.在该调用之后,服务器增加该帖子的viewsCount值,当用户返回帖子列表时,我需要在列表项中更新该计数器.
问题是,如何在该PagedList中更新单个项目(post),因为我不需要从头开始重新加载所有列表只是为了更新单个项目.
我需要一些建议;
我正在试验导航库.我有一个有webView的片段.我想检查它canGoBack是否可以这样做,否则不会干扰.
1.接口方法:由于Navigation正在处理事务,我不再手动创建片段的实例,我可以将其指定为活动中的监听器.
1.重点聆听:我认为它看起来很难看,我不认为这是一个通用的解决方案,所以我跳过这个.
关于如何使用导航库,我需要一些意见.当你试图从中获取currentDestination时navController,它的NavigationDestination对象提供有关当前片段的信息,例如xml中给出的标签.
当我检查时fragmentManager,我发现它backStack是空的并且片段事务发生时没有标记.
恕我直言,它不适合库的概念来进行findFragment某种操作以与当前片段进行某种程度的交互,但我现在似乎无法通过它找到方法.有什么建议 ?
android android-fragments kotlin android-architecture-components android-architecture-navigation
我有以下一次性工作人员.
// 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 中的 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仓库网站在这里,但我并没有对如何编译它的任何信息。
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
我需要在 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) 我目前正在考虑将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
我添加了一些代码以使我的问题更清楚。
改造界面:
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 ×10
android-architecture-components ×10
kotlin ×4
android-architecture-lifecycle ×1
android-architecture-navigation ×1
java ×1
viewmodel ×1