Android中Activity自动切换与按钮切换冲突问题修复请求
解决Activity自动切换与按钮点击切换的异常问题
首先咱们先定位你代码里的核心问题:
- 定时器的
run()方法是在子线程执行的,而Android规定startActivity()必须在主线程调用,这就是点击按钮或定时器触发时出现异常的主要原因。 - 另外你定义了多个重复的Intent(比如
intent和intent2都是跳转到MainActivity),不仅冗余还容易导致逻辑混乱;而且定时器没有在Activity销毁时取消,会引发内存泄漏,甚至在Activity已经被销毁后还尝试跳转,导致崩溃。
下面是修复后的完整代码,我标注了关键修改点:
public class Ljeto extends AppCompatActivity { private Timer timer; private TimerTask timerTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ljeto); // 初始化按钮和Intent,去掉冗余定义 Button buttonNaprijed = findViewById(R.id.NaprijedLjeto); Button buttonNazad = findViewById(R.id.NazadLjeto); Intent intentToMain = new Intent(this, MainActivity.class); Intent intentToProljece = new Intent(this, Proljece.class); // 前进按钮点击事件 buttonNaprijed.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 点击按钮后取消自动跳转,避免两种跳转逻辑冲突 cancelAutoSwitch(); startActivity(intentToMain); } }); // 返回按钮点击事件 buttonNazad.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { cancelAutoSwitch(); startActivity(intentToProljece); } }); // 初始化自动跳转定时器 setupAutoSwitch(intentToMain); } // 封装自动跳转逻辑 private void setupAutoSwitch(final Intent targetIntent) { timer = new Timer(); timerTask = new TimerTask() { @Override public void run() { // 必须切换到主线程执行startActivity runOnUiThread(new Runnable() { @Override public void run() { startActivity(targetIntent); } }); } }; // 5秒后自动跳转 timer.schedule(timerTask, 5000); } // 取消自动跳转,防止内存泄漏和跳转冲突 private void cancelAutoSwitch() { if (timerTask != null) { timerTask.cancel(); } if (timer != null) { timer.cancel(); } } @Override protected void onDestroy() { super.onDestroy(); // Activity销毁时一定要取消定时器,避免内存泄漏 cancelAutoSwitch(); } }
关键修改说明:
- 主线程执行跳转:用
runOnUiThread()把startActivity()切换到主线程,解决子线程调用UI相关方法的异常。 - 取消定时器:不管是点击按钮还是Activity销毁,都取消定时器,避免自动跳转和手动跳转冲突,同时防止内存泄漏。
- 简化Intent定义:去掉重复的Intent,让代码逻辑更清晰。
- 封装逻辑:把自动跳转和取消跳转的逻辑封装成独立方法,提高代码可读性和可维护性。
这样修改后,你的Activity就能正常实现手动点击按钮切换和5秒自动切换,不会出现异常,也不会有跳过Activity的问题啦。
内容的提问来源于stack exchange,提问作者Deni Lasan
相关产品推荐
相关产品推荐

