我有一个名为SharedViewModel的ViewModel:
public class SharedViewModel<T> extends ViewModel {
private final MutableLiveData<T> selected = new MutableLiveData<>();
public void select(T item) {
selected.setValue(item);
}
public LiveData<T> getSelected() {
return selected;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Google的Arch ViewModel参考页面上基于SharedViewModel示例实现它:
活动中的两个或更多个片段需要彼此通信是很常见的.这绝不是微不足道的,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起.而且,两个片段必须处理尚未创建或不可见的其他片段的情况.
我有两个片段,叫做ListFragment和DetailFragment.
到现在为止我用里面称这两个片段MasterActivity.一切都运作良好.
我得到了ViewModel ListFragment,选择了要使用它的值DetailFragment.
mStepSelectorViewModel = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
Run Code Online (Sandbox Code Playgroud)
但是,现在我需要在某些情况下ListFragment(将不同设备配置的布局)添加到另一个名为的活动中DetailActivity.有没有办法像上面的例子那样做?
android viewmodel android-fragments android-activity android-architecture-lifecycle
我有一个扩展AppCompactActivity的Activity,在onCreate方法中我以通常的方式设置了Toolbarusing setSupportActionBar方法:
public class StepMasterActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_step_master);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);`
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在我有一个ViewModel组件,并在作为此活动的子代的片段之间共享数据并管理生命周期,我必须在Activity中获取此组件,因此我将其扩展为LifecycleActivity.
public class StepMasterActivity extends LifecycleActivity {
@Override
public class StepMasterActivity extends LifecycleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_step_master);
// setToolbar();
SharedViewModel sharedViewModel = ViewModelProviders.of(this).get(SharedViewModel.class);
}
}
Run Code Online (Sandbox Code Playgroud)
但我注意到LifecycleActivity与AppCompatActivity无关,而FragmentActivity也没有.
public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {
private final LifecycleRegistry mRegistry = new LifecycleRegistry(this);
public LifecycleActivity() {
} …Run Code Online (Sandbox Code Playgroud) android activity-lifecycle android-activity android-architecture-lifecycle android-architecture-components
从最近我的应用程序开始在预发布报告中包含奇怪的错误消息(上传到Play商店后自动生成).
这些报告包含以下异常:
Exception java.lang.NoSuchMethodError: No interface method a(Landroid/arch/lifecycle/e;Landroid/arch/lifecycle/b$a;)V in class Landroid/arch/lifecycle/GenericLifecycleObserver; or its super classes (declaration of 'android.arch.lifecycle.GenericLifecycleObserver' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk)
android.arch.lifecycle.f$a.a (f.java:326)
android.arch.lifecycle.f.a (f.java:159)
com.firebase.ui.database.FirebaseRecyclerAdapter.<init> (FirebaseRecyclerAdapter.java:40)
Run Code Online (Sandbox Code Playgroud)
和:
Exception java.lang.NoSuchMethodError: No static method a(Landroid/app/Activity;)V in class Landroid/arch/lifecycle/ReportFragment; or its super classes (declaration of 'android.arch.lifecycle.ReportFragment' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk)
android.arch.lifecycle.LifecycleDispatcher$DispatcherActivityCallback.onActivityCreated (LifecycleDispatcher.java:77)
android.app.Application.dispatchActivityCreated (Application.java:219)
android.app.Activity.onCreate (Activity.java:1040)
android.support.v4.app.SupportActivity.onCreate (SupportActivity.java:66)
android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:285)
android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84)
Run Code Online (Sandbox Code Playgroud)
和:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.arch.core.internal.SafeIterableMap.size()' on a null object reference
at android.arch.lifecycle.LifecycleRegistry.getObserverCount(LifecycleRegistry.java:204)
at android.arch.lifecycle.ProcessLifecycleOwner.b(ProcessLifecycleOwner.java:154)
at …Run Code Online (Sandbox Code Playgroud) android firebase firebase-test-lab android-architecture-lifecycle android-architecture-components
我正在使用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
我需要将一个LiveData对象返回的一种数据转换为后台线程上的另一种形式,以防止UI滞后.
在我的具体案例中,我有:
MyDBRow对象(由原始longs和Strings 组成的POJO );LiveData<List<MyDBRow>>; 和MyRichObject对象(POJO与原语膨胀成例如日期/时间对象)所以我需要将我LiveData<List<MyDBRow>>变成一个LiveData<List<MyRichObject>>,但不是在UI线程上.
该Transformations.map(LiveData<X>, Function<X, Y>)方法需要转换,但我不能使用它,因为它在主线程上执行转换:
将主线程上的给定函数应用于
sourceLiveData 发出的每个值,并返回生成结果值的LiveData.给定的函数
func将在主线程上执行.
什么是进行LiveData转换的简洁方法:
android android-thread android-room android-architecture-lifecycle android-architecture-components
我正在尝试ViewModel使用Robolectric.
这是我的 ViewModel
问候视图模型.kt
@FlowPreview
@ExperimentalCoroutinesApi
class GreetingsViewModel : ViewModel() {
private val greetingsChannel = ConflatedBroadcastChannel<String>()
/**
* Whenever greetingsChannel offers a value, prepend `Hello ` with it and return.
*/
val greetingsResponse = greetingsChannel.asFlow()
.flatMapLatest { name ->
flowOf("Helo $name")
}.asLiveData(viewModelScope.coroutineContext)
/**
* To get new greetings
*/
fun askGreetings(name: String) {
greetingsChannel.offer(name)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的单元测试文件
问候ViewModelTest.kt
@FlowPreview
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
class GreetingsViewModelTest2 {
@Test
fun greeting_askGreetings_getWithName() {
val testViewModel = GreetingsViewModel()
testViewModel.askGreetings("john")
testViewModel.greetingsResponse.getOrAwaitValue().should.equal("Hello john")
} …Run Code Online (Sandbox Code Playgroud) android robolectric android-testing android-architecture-lifecycle kotlin-coroutines
我在android官方文档中阅读了有关生命周期和实时数据的文档.我知道该类实现了LifeCycleObserver并使位置监听器自动关闭或打开.我也知道实时数据可以自动激活或激活.我试图使用这两种方式实现Location Observer.它工作正常,当位置更新时它显示Toast 2次.
我的问题是,如果我真的想实现像DB Connection,GPS Location,Download Image,运行后台服务这样的方式,这两种方式有什么区别.我可以使用LiveData类吗?因为我只需要实现主动和非主动功能.
LocationLiveData.java
public class LocationLiveData extends LiveData<Location> {
private LocationManager locationManager;
private Context context;
public LocationLiveData(Context context) {
this.context = context;
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
}
private LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
setValue(location);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
};
@Override
protected void …Run Code Online (Sandbox Code Playgroud) android android-architecture-lifecycle android-architecture-components
最近我在gradle文件中更新了android.arch支持库版本
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.1"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.1"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"
// Room (use 1.1.0-alpha1 for latest alpha)
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
// Paging
implementation "android.arch.paging:runtime:1.0.0-alpha7"
Run Code Online (Sandbox Code Playgroud)
现在我声明了这个错误
android android-gradle-plugin android-architecture-lifecycle android-architecture-components
我尝试为支持架构组件生命周期事件的函数添加单元测试。为了支持生命周期事件,我@OnLifecycleEvent为我的函数添加了注释,我想在该事件发生时做一些事情。
一切都按预期工作,但我想为该函数创建一个单元测试,以检查我的函数在预期事件发生时运行。
public class CarServiceProvider implements LifecycleObserver {
public void bindToLifeCycle(LifecycleOwner lifecycleOwner) {
lifecycleOwner.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onClear() {
Log.i("CarServiceProvider", "onClear called");
}
}
Run Code Online (Sandbox Code Playgroud)
我试图模拟 LifecycleOwner 并创建新的 LifecycleRegistery 来改变生命周期观察者的状态,但我没有这样做。
如何测试onClear()状态更改时调用的函数?
android android-testing android-architecture-lifecycle android-architecture-components
我目前LifecycleObserver用于通知诸如onStart我的观点之类的事件。这对于作为演示者或处理程序的组件非常有用,例如FacebookLoginHandler一旦视图准备好就需要注册回调。但是,在某些情况下,正如我提到的那样,我希望我的处理程序处理另一个活动的返回数据。
例子:
当我选择使用 Facebook 登录时,它会启动另一个活动,并将其返回到视图的onActivityResult方法。这让我FacebookLoginHandler在视图中注入 my ,只是将处理委托给它。我想用来LifecycleObserver获得通知onActivityResult并避免将我的处理程序耦合到视图仅用于委派此事件。有没有办法做到这一点?
android android-facebook android-architecture-lifecycle android-architecture-components
android ×10
android-architecture-lifecycle ×10
android-architecture-components ×8
android-room ×1
firebase ×1
java ×1
robolectric ×1
viewmodel ×1