ViewModelProvider 从调试更改为发布变体时出现 java.lang.ClassCastException

问题描述 投票:0回答:1

我正在尝试从我的公司构建应用程序,但是当我将构建变体更改为发布时(该变体仅更改项目配置文件,例如端点和凭据),我收到此错误:

FATAL EXCEPTION: main
Process: com.timo.ecocloud.paciente, PID: 15435
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.timo.ecocloud.paciente/com.timo.ecocloudpaciente.ui.login.LoginActivity}: java.lang.ClassCastException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7839)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.ClassCastException
    at android.support.v4.media.session.b.a(SourceFile:1)
    at j1.a.<init>(SourceFile:1)
    at com.timo.ecocloudpaciente.ui.login.f.a(SourceFile:1)
    at androidx.lifecycle.s.b(SourceFile:1)
    at androidx.lifecycle.s.a(SourceFile:1)
    at com.timo.ecocloudpaciente.ui.login.LoginActivity.onCreate(Unknown Source:68)
    at android.app.Activity.performCreate(Activity.java:8051)
    at android.app.Activity.performCreate(Activity.java:8031)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loopOnce(Looper.java:201) 
    at android.os.Looper.loop(Looper.java:288) 
    at android.app.ActivityThread.main(ActivityThread.java:7839) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)    
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

产生错误的代码是这样的:

loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory())
                .get(LoginViewModel.class);

我尝试更新所有内容,甚至使用更新的版本:

new ViewModelProvider(this, new LoginViewModelFactory()).get(LoginViewModel.class);

但是到目前为止没有任何效果,有人知道如何解决这个问题吗?

编辑:viewmodel、viewmodelfactory代码如下: 在活动中(生成错误的代码)

loginViewModel = ViewModelProviders.of(this, new LoginViewModelFactory())
                .get(LoginViewModel.class);

LoginViewModel.java:

package com.timo.ecocloudpaciente.ui.login;

import android.app.Activity;
import android.util.Log;
import android.util.Patterns;

import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.timo.ecocloudpaciente.data.LoginRepository;
import com.timo.ecocloudpaciente.R;
import com.timo.ecocloudpaciente.model.DefaultResponse;
import com.timo.ecocloudpaciente.model.DefaultResponseResult;
import com.timo.ecocloudpaciente.model.User;

public class LoginViewModel extends ViewModel {

    private MutableLiveData<LoginFormState> loginFormState = new MutableLiveData<>();
    private MutableLiveData<RecoverFormState> recoverFormState = new MutableLiveData<>();

    private MutableLiveData<LoginResult> loginResult = new MutableLiveData<>();
    private MutableLiveData<DefaultResponseResult> defaultResult = new MutableLiveData<>();
    private LoginRepository loginRepository;

    LoginViewModel(LoginRepository loginRepository) {
        this.loginRepository = loginRepository;
    }


    /**
     * Login
     */

    LiveData<LoginFormState> getLoginFormState() {
        return loginFormState;
    }

    LiveData<LoginResult> getLoginResult() {
        return loginResult;
    }

    public void login(String username, String password) {
        // can be launched in a separate asynchronous job
        loginRepository.login(username, password, this);
    }

    public void loginDataChanged(String username, String password) {
        if (!isUserNameValid(username)) {
            loginFormState.setValue(new LoginFormState(R.string.login_invalid_username, null));
        } else if (!isPasswordValid(password)) {
            loginFormState.setValue(new LoginFormState(null, R.string.login_invalid_password));
        } else {
            loginFormState.setValue(new LoginFormState(true));
        }
    }

    // A placeholder username validation check
    private boolean isUserNameValid(String username) {
        return username != null && !username.equals("");
    }

    // A placeholder password validation check
    private boolean isPasswordValid(String password) {
        return password != null && password.trim().length() == 6;
    }

    /**
     * Used for callback
     */
    public void onSuccess(User user) {
        loginResult.setValue(new LoginResult(user));
    }

    public void onError(String message) {
        loginResult.setValue(new LoginResult(message));
    }

    /**
     * Recover password
     */
    LiveData<RecoverFormState> getRecoverFormState() {
        return recoverFormState;
    }

    public void recoverDataChanged(String useremail) {

        if (!isEmailValid(useremail)) {
            recoverFormState.setValue(new RecoverFormState(R.string.recover_invalid_email));
        }else {
            recoverFormState.setValue(new RecoverFormState(true));
        }
    }

    LiveData<DefaultResponseResult> getDefaultResult() {
        return defaultResult;
    }

    public void recoverPwd(Activity activity, LoginViewModel loginViewModel, String email){
        loginRepository.recoverPwd(activity, loginViewModel,  email);
    }

    private boolean isEmailValid(String email){
        if (email == null || email.trim().isEmpty())
           return false;

        if (email.contains("@"))
            return Patterns.EMAIL_ADDRESS.matcher(email).matches();
        else
            return false;
    }


    /**
     * Used for callback
     */
    public void defaultReturnOnSuccess(DefaultResponse defaultResponse) {
        defaultResult.setValue(new DefaultResponseResult(defaultResponse, ""));
    }

    public void defaultReturnOnError(String message) {
        defaultResult.setValue(new DefaultResponseResult(message));
    }
}

LoginViewModelFactory.java

package com.timo.ecocloudpaciente.ui.login;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.annotation.NonNull;

import com.timo.ecocloudpaciente.data.LoginDataSource;
import com.timo.ecocloudpaciente.data.LoginRepository;
public class LoginViewModelFactory implements ViewModelProvider.Factory {
    @NonNull
    @Override
    @SuppressWarnings("unchecked")
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (modelClass.isAssignableFrom(LoginViewModel.class)) {
            return (T) new LoginViewModel(LoginRepository.getInstance(new LoginDataSource()));
        } else {
            throw new IllegalArgumentException("Unknown ViewModel class");
        }
    }
}
java android viewmodel viewmodelproviders
1个回答
0
投票

如果您最近将 AGP 升级到 8.+

只需将此行添加到您的 gradle.properties 文件中

android.enableR8.fullMode=false
© www.soinside.com 2019 - 2024. All rights reserved.