【问题标题】:Android ViewModel, update LiveData inside a timerAndroid ViewModel,在计时器内更新 LiveData
【发布时间】: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


    【解决方案1】:

    答案很简单,只需在代码底部添加onCreateView即可

     public class MainActivity extends AppCompatActivity
     {
         private Button buttonBack_activity;
         TextView textView_1;
         public static 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);
    
    
        try{
    
            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();
            LiveData<String> shoppingList = model.getshoppinglist();
            model.getshoppinglist().observe(this, new Observer<String>(){
                @Override
                public void onChanged(@Nullable String s)
                {
                    textView_1.setText(s);
                    Log.d("Debug", "String has been updated ->"+s);
                }
            });
    
    
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    
        }
    
       @Nullable
       @Override
       public View onCreateView(@NonNull String name, @NonNull Context context, 
       @NonNull AttributeSet attrs) {
    
            return super.onCreateView(name, context, attrs);
      }
      }
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2020-05-17
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 2021-07-16
      • 1970-01-01
      • 2021-11-04
      相关资源
      最近更新 更多