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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:49:05