Android ViewModel对象使用kotlin而不是java重新创建
我是kotlin和mvvm的新手,但是我能够让它在java中工作,但是当我在kotlin中制作了一个新的mvvm改造实例时,视图模型总是在调用OnCreate函数时被调用(根据文档,这不应该发生,在java中工作得很好) 主要活动:Android ViewModel对象使用kotlin而不是java重新创建,android,kotlin,mvvm,android-livedata,Android,Kotlin,Mvvm,Android Livedata,我是kotlin和mvvm的新手,但是我能够让它在java中工作,但是当我在kotlin中制作了一个新的mvvm改造实例时,视图模型总是在调用OnCreate函数时被调用(根据文档,这不应该发生,在java中工作得很好) 主要活动: lateinit var viewModel : MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
lateinit var viewModel : MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Here we can see the logs in every orientation changed in the emulator.
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.getMutableLiveDataModel().observe(this, Observer {
Log.d("zzzz","lamda executes onChanged method -> "+ it.otherValues). //element from model
})
}
MyViewModel:
class MyViewModel : ViewModel() {
private lateinit var objectTypeModel: MutableLiveData<MyTestModel>
fun getMutableLiveDataModel():MutableLiveData<MyTestModel>{
//Gets the model from a retrofit service call
objectTypeModel = MyRepository.getModelFromService()
return objectTypeModel
}
}
类MyViewModel:ViewModel(){
私有lateinit var objectTypeModel:MutableLiveData
fun getMutableLiveDataModel():MutableLiveData{
//从改装服务调用获取模型
objectTypeModel=MyRepository.getModelFromService()
返回对象类型模型
}
}
我做错什么了吗?已尝试按照其他帖子中的建议将“viewModel”转换为局部变量
Java代码,main活动
MyViewModel模型;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
model=newviewmodelprovider(this.get)(MyViewModel.class);
model.getUsers().observe(这个,新的观察者(){
@凌驾
更改后的公共void(整数用户){
Log.d(“zzzz”,“更新值…”)
}
});
}
模型
公共类MyViewModel扩展了ViewModel{
私有可变LiveData用户;
公共LiveData getUsers(){
如果(用户==null){
用户=新的可变LiveData();
用户设置值(10);
}
返回用户;
}
}
如果不想重新创建视图模型,请按如下方式声明视图模型
private val model: MyViewModel by activityViewModels()
有关更多详细信息,请参阅我认为问题在于您的kotlin viewmodel类,如果您没有获得该值(除非您在其他类中没有更多问题)
//Here it is like this
objectTypeModel.value= MyRepository.getModelFromService()
init{}
方法检查它
onCreate()
方法移动到viewmodelsinit{}
方法,然后观察activity的更改。创建viewmodel对象时,将调用一次您的getMutableLiveDataModel()
类MyViewModel:ViewModel(){
val objectTypeModel=MutableLiveData()
初始化{
objectTypeModel.value=MyRepository.getModelFromService()
}
}
我尝试了相同的概念,正如预期的那样,Java和Kotlin中的功能是相同的。在LogCat中,我希望日志应该在每次旋转时都打印出来,事实确实如此。现在,让我告诉你为什么会这样
因此,根据文档ViewModel
实例在配置更改后保持活动状态。基本上,ViewModel
使用相同的实例,前提是您的活动多次重新创建,但没有被破坏(调用finish()
)。但这不是ViewModel
的魔力,而是LiveData
的魔力
LiveData
是一个可观察的数据视图持有者,因此它会在您在onCreate()
中观察到的每个配置更改时,将最新保留的值发送给活动的观察者
让我向你介绍我的代码
Java
// Activity
public class JavaActivity extends AppCompatActivity {
private static final String TAG = "JavaActivity";
private JavaViewModel javaViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java);
// Ignore this listener
findViewById(R.id.go_to_kotlin_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
// Main
javaViewModel = new ViewModelProvider(this).get(JavaViewModel.class);
javaViewModel.getJavaLiveData().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
Log.d(TAG, "onChanged: " + integer);
}
});
}
}
// ViewModel
public class JavaViewModel extends ViewModel {
private MutableLiveData<Integer> javaLiveData;
public LiveData<Integer> getJavaLiveData() {
if(javaLiveData == null) {
javaLiveData = new MutableLiveData<>();
javaLiveData.setValue(10);
}
return javaLiveData;
}
}
//活动
公共类JavaActivity扩展了AppCompatActivity{
私有静态最终字符串TAG=“JavaActivity”;
私有JavaViewModel JavaViewModel;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java);
//忽略此侦听器
findViewById(R.id.go_to_kotlin_活动)。setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
完成();
}
});
//主要
javaViewModel=newviewmodelprovider(this.get)(javaViewModel.class);
javaViewModel.getJavaLiveData().observe(这是一个新的观察者(){
@凌驾
更改后的公共void(整数){
Log.d(标记“onChanged:+整数);
}
});
}
}
//视图模型
公共类JavaViewModel扩展了ViewModel{
私有MutableLiveData-javaLiveData;
公共LiveData getJavaLiveData(){
if(javaLiveData==null){
javaLiveData=新的MutableLiveData();
javaLiveData.setValue(10);
}
返回javaLiveData;
}
}
Kotlin
// Activity
class KotlinActivity : AppCompatActivity() {
companion object {
private const val TAG = "KotlinActivity"
}
private lateinit var kotlinViewModel: KotlinViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
// Ignore this listener
findViewById<Button>(R.id.go_to_java_activity_btn).setOnClickListener {
startActivity(Intent(this, JavaActivity::class.java))
}
// Main
kotlinViewModel = ViewModelProvider(this).get(KotlinViewModel::class.java)
kotlinViewModel.getKotlinLiveData().observe(this, Observer {
Log.d(TAG, "onCreate: $it")
})
}
}
// ViewModel
class KotlinViewModel : ViewModel() {
private lateinit var kotlinLiveData: MutableLiveData<Int>
fun getKotlinLiveData(): LiveData<Int> {
if (!::kotlinLiveData.isInitialized) {
kotlinLiveData = MutableLiveData()
kotlinLiveData.value = 10
}
return kotlinLiveData
}
}
//活动
类KotlinActivity:AppCompatActivity(){
伴星{
private const val TAG=“KotlinActivity”
}
私有lateinit var kotlinViewModel:kotlinViewModel
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
//忽略此侦听器
findViewById(R.id.go\u to\u java\u activity\u btn){
startActivity(Intent(这是JavaActivity::class.java))
}
//主要
kotlinViewModel=ViewModelProvider(this).get(kotlinViewModel::class.java)
kotlinViewModel.getKotlinLiveData().observe(此,观察者{
Log.d(标记“onCreate:$it”)
})
}
}
//视图模型
类KotlinViewModel:ViewModel(){
私有lateinit var kotlinLiveData:MutableLiveData
fun GetKotLiveData():LiveData{
如果(!::KotLiveData.isInitialized){
lateinit var viewModel : MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.objectTypeModel.observe(this, Observer {
Log.d("zzzz","lamda executes onChanged method -> "+ it.otherValues).
//element from model
})
}
class MyViewModel : ViewModel() {
val objectTypeModel= MutableLiveData<MyTestModel>()
init {
objectTypeModel.value = MyRepository.getModelFromService()
}
}
// Activity
public class JavaActivity extends AppCompatActivity {
private static final String TAG = "JavaActivity";
private JavaViewModel javaViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_java);
// Ignore this listener
findViewById(R.id.go_to_kotlin_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
// Main
javaViewModel = new ViewModelProvider(this).get(JavaViewModel.class);
javaViewModel.getJavaLiveData().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
Log.d(TAG, "onChanged: " + integer);
}
});
}
}
// ViewModel
public class JavaViewModel extends ViewModel {
private MutableLiveData<Integer> javaLiveData;
public LiveData<Integer> getJavaLiveData() {
if(javaLiveData == null) {
javaLiveData = new MutableLiveData<>();
javaLiveData.setValue(10);
}
return javaLiveData;
}
}
// Activity
class KotlinActivity : AppCompatActivity() {
companion object {
private const val TAG = "KotlinActivity"
}
private lateinit var kotlinViewModel: KotlinViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
// Ignore this listener
findViewById<Button>(R.id.go_to_java_activity_btn).setOnClickListener {
startActivity(Intent(this, JavaActivity::class.java))
}
// Main
kotlinViewModel = ViewModelProvider(this).get(KotlinViewModel::class.java)
kotlinViewModel.getKotlinLiveData().observe(this, Observer {
Log.d(TAG, "onCreate: $it")
})
}
}
// ViewModel
class KotlinViewModel : ViewModel() {
private lateinit var kotlinLiveData: MutableLiveData<Int>
fun getKotlinLiveData(): LiveData<Int> {
if (!::kotlinLiveData.isInitialized) {
kotlinLiveData = MutableLiveData()
kotlinLiveData.value = 10
}
return kotlinLiveData
}
}