【发布时间】:2020-12-30 19:49:11
【问题描述】:
我想在我的移动应用程序中设置倒计时,我使用 ViewModel 和 LiveData 在不同活动之间共享数据并更新 UI。我知道 ViewModel 和 LiveData 正在工作,因为我有一个保存数据的按钮,但是当我从计时器尝试相同的操作时,我收到以下错误:
您的活动尚未附加到应用程序实例。您不能在 onCreate 调用之前请求 ViewModel。
我认为“model = new ViewModelProvider(this).get(viewmodelclass.class);”是错误的,但我试图在调用 ViewModel 类之前延迟计时器,以便它有时间初始化所有变量。所以不知道如何获取对 ViewModel 类的引用?
任何如何解决此问题的想法都将受到高度赞赏,因为它看起来很简单,但会绕着圈子试图解决它。
MainActivity 类
package com.example.viewmodellivedata_sandpit;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
{
private Button buttonBack_activity;
public viewmodelclass model;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Get a reference to the ViewModel
model = new ViewModelProvider(this).get(viewmodelclass.class);
LiveData<String> shoppingList = model.getshoppinglist();
model.getshoppinglist().observe(this, new Observer<String>(){
@Override
public void onChanged(@Nullable String s)
{
Log.d("Debug", "String has been updated");
}
});
TextView textView_1 = findViewById(R.id.textView1);
buttonBack_activity = (Button) findViewById(R.id.button1);
buttonBack_activity.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
Log.d("Debug", "Button pressed");
model.writedatatest("send text");
}
});
TimerStateMachineClass mActivity= new TimerStateMachineClass();
mActivity.starttimer();
}
}
ViewModel 类
package com.example.viewmodellivedata_sandpit;
import android.util.Log;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class viewmodelclass extends ViewModel {
public MutableLiveData<String> shoppingList;
public MutableLiveData<String> getshoppinglist() {
if (shoppingList == null) {
Log.w("Debug", "Inside the get shopping list");
shoppingList = new MutableLiveData<>();
writedatatest("test message");
}
return shoppingList;
}
public void writedatatest(String incomingdata)
{
Log.w("Debug", "Inside the get shopping list 1 -> "+shoppingList.getValue());
shoppingList.postValue(incomingdata);
}
}
定时器类
public class TimerStateMachineClass extends AppCompatActivity {
public Timer myTimer;
public viewmodelclass model;
int coutner;
public void starttimer()
{
Log.w("Debug", "onCreate savedInstanceState");
model = new ViewModelProvider(this).get(viewmodelclass.class);
Log.w("Debug", "Function start timer");
myTimer = new Timer();
coutner = 0;
myTimer.schedule(new TimerTask() {
public void run() {
TimerMethod();
}
}, 0, 1000);
}
public void TimerMethod()
{
Log.w("Debug", "Timer execution");
// LiveData<String> shoppingList = model.getshoppinglist();
coutner++;
model.writedatatest(Integer.toString(coutner));
}
}
【问题讨论】:
标签: javascript android viewmodel android-livedata