繁体   English   中英

如何在mvvm模式中有一个闪屏,在Android中有空间?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM