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

