You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Splash页面冻结求助:无法3秒后跳转至Login页面

启动页冻结无法跳转至LoginActivity问题排查

问题描述

实现应用启动页时遇到问题:要求显示启动页3秒后自动跳转至LoginActivity,但启动页一直处于冻结状态,无法完成跳转。相关源码如下:

SlashActivity.java(启动页类)

public class SlashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity);

        try {
            Thread.sleep(3000);
        } catch (Exception e) {


            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            startActivity(intent);
            finish();
        }
    }
}

LoginActivity.java

public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mFirebaseAuth = FirebaseAuth.getInstance();
        mDatabaseRef = FirebaseDatabase.getInstance().getReference();

        EtEmail = findViewById(R.id.EtEmail);
        EtPwd = findViewById(R.id.EtPwd);
        Btn_Register = findViewById(R.id.Btn_Register);
        Btn_Login = findViewById(R.id.Btn_Login);

        Btn_Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(EtEmail.getText().length() > 0 && EtPwd.getText().length() > 0) {
                    String strEmail = EtEmail.getText().toString();
                    String strPwd = EtPwd.getText().toString();
                    mFirebaseAuth.signInWithEmailAndPassword(strEmail, strPwd).addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (task.isSuccessful()) {
                                // 로그인 성공
                                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                startActivity(intent);
                                finish();
                            } else {
                                Toast.makeText(LoginActivity.this, "로그인 실패", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                } else {
                    Toast.makeText(LoginActivity.this, "아이디와 비밀번호를 확인해주세요.", Toast.LENGTH_SHORT).show();
                }
            }
        });
        Btn_Register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
                startActivity(intent);
            }
        });
            }
        }

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_icon"
    android:label="HomePet"
    android:roundIcon="@mipmap/ic_icon"
    android:supportsRtl="true"
    android:theme="@style/Theme.Project"
    tools:targetApi="31" >

    <activity android:name=".SlashActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".map.MapsActivity"
        android:exported="false"
        android:label="MapsActivity" />
    <activity
        android:name=".User_Account"
        android:exported="false" />
    <activity
        android:name=".RegisterActivity"
        android:exported="false" />
    <activity
        android:name=".LoginActivity"
        android:exported="true" >
    </activity>
    <activity
        android:name=".MainActivity"
        android:exported="true" >
    </activity>

    <activity android:name=".Useredit_Activity"/>
    <activity android:name=".LogoutActivity"/>
    <activity android:name=".NoticeActivity"/>
    <activity android:name=".HospitalActivity"
        android:exported="false"/>
</application>

问题原因

  • 主线程阻塞:SlashActivity的onCreate方法中调用Thread.sleep(3000),直接阻塞了UI主线程,导致启动页无法完成渲染,出现冻结状态。
  • 跳转逻辑位置错误:跳转代码被放在catch块内,只有当Thread.sleep()抛出异常时才会执行,而正常延迟3秒后不会触发异常,因此跳转逻辑永远不会执行。

修复方案

替换SlashActivity的实现,使用Handler.postDelayed实现非阻塞式延迟跳转:

public class SlashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity);

        // 3秒后执行跳转逻辑,不阻塞主线程
        new Handler(Looper.getMainLooper()).postDelayed(() -> {
            Intent intent = new Intent(SlashActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }, 3000);
    }
}

关键说明

  • 禁止在UI主线程执行Thread.sleep()、网络请求等耗时操作,否则会引发ANR(应用无响应)错误。
  • 延迟操作推荐使用Handler.postDelayed或Coroutine(Kotlin),确保主线程始终处于可响应状态。

内容的提问来源于stack exchange,提问作者kimzero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:06:19