【问题标题】:Error om.appsnipp.niasbaratepresensi.welcome_activity cannot be cast to com.appsnipp.niasbaratepresensi.DashboardActivity错误 om.appsnipp.niasbaratepresensi.welcome_activity 无法转换为 com.appsnipp.niasbaratepresensi.DashboardActivity
【发布时间】:2022-01-20 22:43:26
【问题描述】:

我在Android上做了一个自动登录,代码如下。但我得到这个错误:


E/AndroidRuntime: 致命异常: main 进程:com.appsnipp.nbpresensi,PID:14850 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.appsnipp.nbpresensi/com.appsnipp.niasbaratepresensi.welcome_activity}:java.lang.ClassCastException:com.appsnipp.niasbaratepresensi.welcome_activity 无法转换为 com.appsnipp.niasbaratepresensi。仪表板活动 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3454) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3593) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2126) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:264) 在 android.app.ActivityThread.main(ActivityThread.java:7684) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) 引起:java.lang.ClassCastException:com.appsnipp.niasbaratepresensi.welcome_activity 无法转换为 com.appsnipp.niasbaratepresensi.DashboardActivity 在 com.appsnipp.niasbaratepresensi.SessionManager.checkLogin(SessionManager.java:51) 在 com.appsnipp.niasbaratepresensi.welcome_activity.onCreate(welcome_activity.java:19) 在 android.app.Activity.performCreate(Activity.java:7817) 在 android.app.Activity.performCreate(Activity.java:7806) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3424) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3593) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2126) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:264) 在 android.app.ActivityThread.main(ActivityThread.java:7684) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) I/Process:发送信号。 PID:14850 SIG:9 进程 14850 终止。


这是我的欢迎活动代码:

 public class welcome_activity extends AppCompatActivity {
        SessionManager sessionManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_welcome);
    
            sessionManager = new SessionManager(this);
            sessionManager.checkLogin();
    
            HashMap<String, String> user = sessionManager.getUserDetail();
            String mNip = user.get(sessionManager.NIP);
            if (mNip.equals(mNip)) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(welcome_activity.this, DashboardActivity.class);
                        startActivity(intent);
                        finish();
                    }
                }, 2000);
            } else {
                Intent intent = new Intent(welcome_activity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        }
    }

这是我的会话管理器:

public class SessionManager {
    SharedPreferences sharedPreferences;
    public SharedPreferences.Editor editor;
    public Context context;
    int PRIVATE_MODE = 0;

    private static final String PREF_NAME = "LOGIN";
    private static final String LOGIN = "IS_LOGIN";
    public static final String NM_LENGKAP = "NM_LENGKAP";
    public static final String NIP = "NIP";
    public static final String PASSWORD = "PASSWORD";
    public static final String JABATAN = "JABATAN";
    public static final String OPD = "OPD";
    public static final String GAMBAR = "GAMBAR";

    public SessionManager(Context context) {
        this.context = context;
        sharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = sharedPreferences.edit();
    }

    public void createSession(String nm_lengkap, String nip, String password, String jabatan,String opd,String gambar) {
        editor.putBoolean(LOGIN, true);
        editor.putString(NM_LENGKAP, nm_lengkap);
        editor.putString(NIP, nip);
        editor.putString(PASSWORD, password);
        editor.putString(JABATAN, jabatan);
        editor.putString(OPD, opd);
        editor.putString(GAMBAR, gambar);
        editor.apply();

    }

    public boolean isLoggin() {
        return sharedPreferences.getBoolean(LOGIN, false);
    }

    public void checkLogin() {
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((DashboardActivity) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((welcome_activity) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Absen_Activity1) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Absen_Activity2) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((UbahPwd) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Lihat_Absen1) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Lihat_Absen2) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Sudah_Activity) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((ProfileActivity) context).finish();
        }
    }

    public HashMap<String, String> getUserDetail() {
        HashMap<String, String> user = new HashMap<>();
        user.put(NM_LENGKAP, sharedPreferences.getString(NM_LENGKAP, null));
        user.put(NIP, sharedPreferences.getString(NIP, null));
        user.put(PASSWORD, sharedPreferences.getString(PASSWORD, null));
        user.put(JABATAN, sharedPreferences.getString(JABATAN, null));
        user.put(OPD, sharedPreferences.getString(OPD, null));
        user.put(GAMBAR, sharedPreferences.getString(GAMBAR , null));
        return user;
    }

    public void logout() {
        editor.clear();
        editor.commit();
        Intent i = new Intent(context, LoginActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

谁能告诉我这是怎么回事?

【问题讨论】:

    标签: android android-studio aws-session-manager


    【解决方案1】:

    您正在使用welcome_activity 上下文初始化SessionManager,但将其转换为DashboardActivity 上下文。这就是它失败的原因。

    不要从 SessionManager 中完成上下文(返回一个值,用它来完成调用活动)

    您的 checkLogin 函数是样板文件并且具有不安全的转换。你可以试试这个:

    在会话管理器中:

    public boolean checkLogin(){
         return !this.isLoggin();
    }
    

    活动中:

            sessionManager = new SessionManager(this);
            if(!sessionManager.checkLogin()){
                Intent i = new Intent(context, LoginActivity.class);
                context.startActivity(i);
                finish();
                return;
             }
    

    【讨论】:

    • 我试过了,还是不行,有没有别的解决办法?
    • 你能在添加后发布堆栈跟踪吗?
    • 你告诉我讨论使用会话管理器自动登录的链接了吗?
    • 我不确定你指的是什么。你说我给的代码不起作用,所以我想知道你是在使用我的代码后给我stacktrace,还是stacktrace没有改变。
    • 它起作用了,但是当我返回登录时,我再次按下该活动再次被带回仪表板,
    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 2014-02-03
    • 2021-08-21
    • 2021-11-18
    • 1970-01-01
    • 2022-01-25
    • 2018-11-20
    • 2014-01-15
    相关资源
    最近更新 更多