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

Android Studio中Activity缺失默认构造函数致页面崩溃求助

解决Activity因缺少默认构造函数导致的崩溃问题

错误原因

你遇到的错误:

该类应提供默认构造函数(无参公共构造函数)(com.example.feuerwerkzndanlage.empfaenger_1_zuenden)

核心问题在于Android系统启动Activity时,依赖反射机制调用无参的公共构造函数来实例化Activity。你为Activity添加了带ConnectedThread参数的构造函数后,Java默认的无参构造函数会被覆盖,系统无法创建Activity实例,直接引发崩溃。

修复方案

1. 为Activity添加无参构造函数

修改你的Activity代码,显式添加无参公共构造函数,同时调整mConnectedThread的定义(去掉final,因为需要后续赋值):

package com.example.feuerwerkzndanlage;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import java.util.concurrent.atomic.AtomicInteger;

public class empfaenger_1_zuenden extends AppCompatActivity{

    private ConnectedThread mConnectedThread; // 移除final修饰符

    // 必须添加的无参公共构造函数
    public empfaenger_1_zuenden() {
        super();
    }

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

        // 在这里初始化mConnectedThread,推荐两种方式:
        // 方式1:从自定义Application类中获取全局单例
        // mConnectedThread = ((YourApp) getApplication()).getConnectedThread();
        // 方式2:如果ConnectedThread实现Serializable/Parcelable,从Intent中获取
        // mConnectedThread = (ConnectedThread) getIntent().getSerializableExtra("BT_THREAD");

        Context context = getApplicationContext();
        CharSequence back_txt = "Zurück!";
        CharSequence rot_txt = "Zünden!";
        CharSequence gruen_txt = "Reset!";
        int a = 0;
        AtomicInteger b = new AtomicInteger(0);
        AtomicInteger c = new AtomicInteger(0);
        AtomicInteger d = new AtomicInteger(0);
        AtomicInteger e = new AtomicInteger(0);
        AtomicInteger f = new AtomicInteger(0);
        int duration = Toast.LENGTH_SHORT;

        ImageView back = findViewById(R.id.back);
        Button zuenden1_1 = findViewById(R.id.btn_zuenden1_1);
        Button zuenden1_2 = findViewById(R.id.btn_zuenden1_2);
        Button zuenden1_3 = findViewById(R.id.btn_zuenden1_3);
        Button zuenden1_4 = findViewById(R.id.btn_zuenden1_4);
        Button zuenden1_5 = findViewById(R.id.btn_zuenden1_5);

        Button ruecksetzen = findViewById(R.id.btn_ruecksetzen);

        ImageView kanal_1_1 = findViewById(R.id.kanal1_1);
        ImageView kanal_1_2 = findViewById(R.id.kanal1_2);
        ImageView kanal_1_3 = findViewById(R.id.kanal1_3);
        ImageView kanal_1_4 = findViewById(R.id.kanal1_4);
        ImageView kanal_1_5 = findViewById(R.id.kanal1_5);

        back.setOnClickListener(view -> {
            Toast.makeText(context, back_txt, duration).show();
            startActivity(new Intent(empfaenger_1_zuenden.this, zuenden.class));
        });

        ruecksetzen.setOnClickListener(view -> {
            Toast.makeText(context, gruen_txt, duration).show();
            kanal_1_1.setImageResource(R.drawable.kanal_gruen);
            kanal_1_2.setImageResource(R.drawable.kanal_gruen);
            kanal_1_3.setImageResource(R.drawable.kanal_gruen);
            kanal_1_4.setImageResource(R.drawable.kanal_gruen);
            kanal_1_5.setImageResource(R.drawable.kanal_gruen);
            b.set(a + 1);
            c.set(a + 1);
            d.set(a + 1);
            e.set(a + 1);
            f.set(a + 1);
        });

        zuenden1_1.setOnClickListener(view -> {
            if (b.get() == 1) {
                Toast.makeText(context, rot_txt, duration).show();
                kanal_1_1.setImageResource(R.drawable.kanal_rot);
                b.set(0);

                if(mConnectedThread != null)
                    mConnectedThread.write("Kanal_1_1_Z");
            }
        });

        zuenden1_2.setOnClickListener(view -> {
            if (c.get() == 1) {
                Toast.makeText(context, rot_txt, duration).show();
                kanal_1_2.setImageResource(R.drawable.kanal_rot);
                c.set(0);

                if(mConnectedThread != null)
                    mConnectedThread.write("Kanal_1_2_Z");
            }
        });

        zuenden1_3.setOnClickListener(view -> {
            if (d.get() == 1) {
                Toast.makeText(context, rot_txt, duration).show();
                kanal_1_3.setImageResource(R.drawable.kanal_rot);
                d.set(0);

                if(mConnectedThread != null)
                    mConnectedThread.write("Kanal_1_3_Z");
            }
        });

        zuenden1_4.setOnClickListener(view -> {
            if (e.get() == 1) {
                Toast.makeText(context, rot_txt, duration).show();
                kanal_1_4.setImageResource(R.drawable.kanal_rot);
                e.set(0);

                if(mConnectedThread != null)
                    mConnectedThread.write("Kanal_1_4_Z");
            }
        });

        zuenden1_5.setOnClickListener(view -> {
            if (f.get() == 1) {
                Toast.makeText(context, rot_txt, duration).show();
                kanal_1_5.setImageResource(R.drawable.kanal_rot);
                f.set(0);

                if(mConnectedThread != null)
                    mConnectedThread.write("Kanal_1_5_Z");
            }
        });
    }
}

2. 正确传递ConnectedThread实例

不要通过构造函数传递ConnectedThread,推荐两种可靠方式:

  • 全局单例:创建自定义Application类,将ConnectedThread实例保存在其中,所有Activity都可以通过getApplication()获取。
  • Intent传递:让ConnectedThread实现Serializable或Parcelable接口,启动Activity时通过intent.putExtra()传递,在onCreate中取出。

3. 批量处理其他Activity

另外9个结构相同的Activity(如empfaenger_2_zuenden至empfaenger_10_zuenden)需要执行完全一致的修改:添加无参构造函数,调整mConnectedThread的初始化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:31:13