[英]how to have a splash screen in mvvm pattern with room in android.?
我正在嘗試使用MVVM模式的登錄活動創建啟動畫面。 我的初始屏幕運行正常,但嘗試完成並啟動LoginActivity時,應用程序崩潰。 我收到此錯誤,如下所示。
請幫助我解決這個問題。 我的項目中需要有一個slapsh屏幕,其中包含LoginActivity的MVVM模式和Room db。 解釋或代碼示例非常受歡迎。
我的飛濺活動
public class SplashActivity extends AppCompatActivity {
public void onAttachedToWindow() {
super.onAttachedToWindow();
Window window = getWindow();
window.setFormat(PixelFormat.RGBA_8888);
}
/**
* Called when the activity is first created.
*/
Thread splashTread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
StartAnimations();
}
private void StartAnimations() {
Animation anim = AnimationUtils.loadAnimation(this, R.anim.alpha);
anim.reset();
LinearLayout l = findViewById(R.id.splash_layout);
l.clearAnimation();
l.startAnimation(anim);
anim = AnimationUtils.loadAnimation(this, R.anim.translate);
anim.reset();
ImageView iv = findViewById(R.id.splash);
iv.clearAnimation();
iv.startAnimation(anim);
splashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
// Splash screen pause time
while (waited < 3500) {
sleep(100);
waited += 100;
}
Intent intent = new Intent(SplashActivity.this,
LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
SplashActivity.this.finish();
} catch (InterruptedException e) {
// do nothing
} finally {
SplashActivity.this.finish();
}
}
};
splashTread.start();
}
}
我的登錄活動
public class LoginActivity extends AppCompatActivity {
private LoginViewModel loginViewModel;
private View mProgressView;
private View mLoginFormView;
private ActivityLoginBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
ActivityLoginBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_login);
//get the view model
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
binding.setUser(loginViewModel);
// The observer updates the UI when Login Operation is successful
loginViewModel.getUser().observe(this, userResponse -> {
if (userResponse != null) {
Toast.makeText(LoginActivity.this, "Login success", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
} else {
Log.d("LoginActivity", "value user is null");
// Show ERROR
}
});
binding.loginButton.setOnClickListener (
(
View view) ->
{
loginViewModel.onBtnLoginClick();
});
}
/**
* Shows the progress UI and hides the login form.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void showProgress(final boolean show) {
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
// for very easy animations. If available, use these APIs to fade-in
// the progress spinner.
int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
mLoginFormView.animate().setDuration(shortAnimTime).alpha(
show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
});
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
mProgressView.animate().setDuration(shortAnimTime).alpha(
show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
}
});
}
}
我的LoginViewModel
public class LoginViewModel extends ViewModel {
private boolean errorMsg = true;
private Validations validations;
// Create a LiveData
private LiveData<User> userResponse;
public static final ObservableField<String> username = new ObservableField<>();
public static final ObservableField<String> password = new ObservableField<>();
public static final ObservableField<String> errorUsername = new ObservableField<>();
public static final ObservableField<String> errorPassword = new ObservableField<>();
private UserRepository userRepository;
public LoginViewModel(Context mContext) {
userRepository = new UserRepository(mContext);
username.set("ccuser");
password.set("67890");
userResponse = userRepository.getUser();
validations=new Validations();
}
public LiveData<User> getUser() {
return userResponse;
}
public void onBtnLoginClick() {
// attemptLogin();
if (validateInputs()) {
userRepository.loginUser(username.get(), password.get());
}
}
@BindingAdapter("error")
public static void setError(EditText editText, Object strOrResId) {
if (strOrResId instanceof Integer) {
editText.setError(
editText.getContext().getString((Integer) strOrResId));
} else {
editText.setError((String) strOrResId);
}
}
@BindingAdapter("onFocus")
public static void bindFocusChange(EditText editText, View.OnFocusChangeListener onFocusChangeListener) {
if (editText.getOnFocusChangeListener() == null) {
editText.setOnFocusChangeListener(onFocusChangeListener);
}
}
//--
public boolean validateInputs() {
boolean isValid = true;
if (username.get() == null || !Validations.isUserNameValid(username.get())) {
errorUsername.set(String.valueOf(R.string.error_invalid_username));
isValid = false;
} else {
errorUsername.set(null);
}
if (password.get() == null || password.get().length() < 8 && !Validations.isPasswordValid(password.get())) {
errorPassword.set(String.valueOf(R.string.error_incorrect_password));
isValid = false;
} else {
errorPassword.set(null);
}
return isValid;
}
}
我得到的錯誤
E / AndroidRuntime:致命例外:主進程:com.comcredit.ccui.cclogin,PID:19969 java.lang.RuntimeException:無法啟動活動ComponentInfo {com.comcredit.ccui.cclogin / com.comcredit.ccui.cclogin.view .LoginActivity}:java.lang.RuntimeException:無法在android.app.ActivityThread.handleLaunchActivity創建類com.comcredit.ccui.cclogin.view_model.LoginViewModel的實例,位於android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2858) (ActivityThread.java:2933)在android.app.ActivityThread.-wrap11(未知來源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1612)在android.os.Handler.dispatchMessage(Handler。 com的android.os.Looper.loop(Looper.java:164)的android.os.Looper.loop(Looper.java:164)的com.java.lang.reflect.Method.invoke(本機方法)的android.app.ActivityThread.main(ActivityThread.java:6710) .android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)原因:java.lang.R untimeException:無法在android.arch.lifecycle.ViewModelProvider $ NewInstanceFactory.create(ViewModelProvider.java:153)上創建com.comcredit.ccui.cclogin.view_model.LoginViewModel類的實例,在android.arch.lifecycle.ViewModelProvider $ AndroidViewModelProvider.create (ViewModelProvider.java:210)在android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)在android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)在com.comcredit.ccui.cclogin。在android.app.Activity.performCreate(Activity.java:6980)在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)的view.LoginActivity.onCreate(LoginActivity.java:45)在android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2811)位於android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2933)位於android.app.ActivityThread.-wrap11(未知源:0),位於android.app.ActivityThread $ H.handleMessage(ActivityThread。 java:1612),位於android.os.Handler.dispatchMessage( android.os.Looper.loop(Looper.java:164)處的Handler.java:105)java.lang.reflect.Method.invoke(本機方法)處android.app.ActivityThread.main(ActivityThread.java:6710)處在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)在由:java.lang.InstantiationException:java .lang.Class在android.arch.lifecycle.ViewModelProvider $ NewInstanceFactory.create(ViewModelProvider.java:151)處的java.lang.Class.newInstance(Native方法)處沒有零參數構造函數android.arch.lifecycle.ViewModelProvider $ AndroidViewModelFactory在com.comcredit.ccui的android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134)在android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102)處創建.View(ViewModelProvider.java:210)。 android.app.Activity.performCreate(Activity.java:6980)上的cclogin.view.LoginActivity.onCreate(LoginActivity.java:45)在android.app.Instrumentation.callActivityOnC reate(Instrumentation.java:1214)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2811)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2933)在android.app.ActivityThread.-wrap11(未知源:0)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1612)在android.os.Handler.dispatchMessage(Handler.java:105)在android.os.Looper.loop(Looper.java:164)在android.app.ActivityThread.main(ActivityThread.java:6710)在com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)處的java.lang.reflect.Method.invoke(本機方法)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)
this
在你的意圖的聲明指的是您的視圖模型。 嘗試改為傳遞完整的活動名稱。
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
使用此代碼:
new Handler().postDelayed(new Runnable()
{
@Override
public void run()
{
Intent intent = new Intent(SplashActivity.this,
LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
SplashActivity.this.finish();
}
},3500);
替換您的代碼:
splashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
// Splash screen pause time
while (waited < 3500) {
sleep(100);
waited += 100;
}
Intent intent = new Intent(SplashActivity.this,
LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
SplashActivity.this.finish();
} catch (InterruptedException e) {
// do nothing
} finally {
SplashActivity.this.finish();
}
}
};
splashTread.start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.