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
相关产品推荐
相关产品推荐

