Activity加入构造方法,必须同时带无参的默认构造方法

本文记录了在Android开发过程中遇到的一个关于Activity构造方法的问题及解决方案。当为Activity添加了一个带参数的构造方法后,若未同时提供无参数构造方法,则通过Intent启动该Activity时会引发InstantiationException错误。
Android 2.3.3   
Eclipse Version: 3.7.0  
LogCat 


主要错误:

 

04-05 14:10:38.163: ERROR/AndroidRuntime(3991): Caused by: java.lang.InstantiationException: com.taobao.htc.manage.Nba
04-05 14:10:38.163: ERROR/AndroidRuntime(3991): at java.lang.Class.newInstanceImpl(Native Method)
04-05 14:10:38.163: ERROR/AndroidRuntime(3991): at java.lang.Class.newInstance(Class.java:1409)
04-05 14:10:38.163: ERROR/AndroidRuntime(3991): at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
04-05 14:10:38.163: ERROR/AndroidRuntime(3991): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1561)
04-05 14:10:38.163: ERROR/AndroidRuntime(3991): ... 11 more


发生错误原因分析:

Nba 继承自 Activity,使用正常,后在其中加入构造方法。

 

	public Nba(Context context) {
		this.context = context;
	}


在其它地方实例化

Nba Nba = new Nba(context);

可正常使用。

 

但在以

	Intent integer = new Intent(context, Nba.class);
	context.startActivity(integer);

方式启动,进入Activity 时,产生上述实例化错误。

 

原来,Activity 默认不需构造方法,但在加入有参的构造方法后,必须同时加入无参的默认构造方法

 

解决办法:

Nba  加入默认构造方法

	public Nba() {
	}


正常。

 

Android 中,`Binder` 类本身并没有直接提供接受集合(如 `List` 或 `Map`)的构造方法。`Binder` 是一个抽象类,通常用于实现跨进程通信(IPC)。如果你想要传递集合数据,可以通过自定义 `Binder` 子类并实现相应的方法来实现。以下是两种常见的方式: --- ### **1. 直接使用 `Binder` 的默认构造方法** `Binder` 类提供了两个默认构造方法: - **无构造方法**:创建一个新的 `Binder` 实例。 - ** `IBinder` 的构造方法**:通常用于跨进程通信,接受一个 `IBinder` 对象。 ```java // 无构造方法 Binder binder1 = new Binder(); // IBinder 的构造方法(通常用于跨进程) IBinder iBinder = ...; // 通常来自其他进程 Binder binder2 = new Binder(iBinder); ``` --- ### **2. 自定义 `Binder` 子类传递集合** 如果需要传递集合(如 `List` 或 `Map`),可以自定义 `Binder` 子类,并在其中定义方法来实现数据的传递。例如: #### **自定义 `Binder` 子类** ```java public class CollectionBinder extends Binder { private List<String> stringList; private Map<String, Integer> stringIntegerMap; public CollectionBinder(List<String> list) { this.stringList = list; } public CollectionBinder(Map<String, Integer> map) { this.stringIntegerMap = map; } // 获取 List public List<String> getStringList() { return stringList; } // 获取 Map public Map<String, Integer> getStringIntegerMap() { return stringIntegerMap; } } ``` #### **发送端:传递集合** ```java List<String> myList = Arrays.asList("A", "B", "C"); Map<String, Integer> myMap = new HashMap<>(); myMap.put("One", 1); myMap.put("Two", 2); // 通过 Intent 传递 Binder Intent intent = new Intent(this, TargetActivity.class); Bundle bundle = new Bundle(); bundle.putBinder("list_binder", new CollectionBinder(myList)); bundle.putBinder("map_binder", new CollectionBinder(myMap)); intent.putExtras(bundle); startActivity(intent); ``` #### **接收端:获取集合** ```java Bundle bundle = getIntent().getExtras(); if (bundle != null) { // 获取 List CollectionBinder listBinder = (CollectionBinder) bundle.getBinder("list_binder"); List<String> receivedList = listBinder.getStringList(); Log.d("BinderExample", "Received List: " + receivedList); // 获取 Map CollectionBinder mapBinder = (CollectionBinder) bundle.getBinder("map_binder"); Map<String, Integer> receivedMap = mapBinder.getStringIntegerMap(); Log.d("BinderExample", "Received Map: " + receivedMap); } ``` --- ### **3. 注意事项** 1. **跨进程限制**: - 如果涉及跨进程通信,`Binder` 对象需要实现 `Parcelable` 或使用 `AIDL`。 - 直接传递集合可能会导致 `TransactionTooLargeException`,建议传递引用或分块传输。 2. **性能优化**: - 对于大型集合,建议使用文件或数据库存储数据,仅传递路径或 ID。 3. **类型安全**: - 使用 `instanceof` 检查 `Binder` 子类类型,避免 `ClassCastException`。 --- ### **4. 替代方案(推荐)** 如果不需要跨进程,可以直接传递 `Parcelable` 或 `Serializable` 对象: ```java // 发送端 intent.putStringArrayListExtra("list_key", new ArrayList<>(myList)); intent.putExtra("map_key", (Serializable) myMap); // 接收端 List<String> receivedList = getIntent().getStringArrayListExtra("list_key"); Map<String, Integer> receivedMap = (Map<String, Integer>) getIntent().getSerializableExtra("map_key"); ``` --- ### **总结** - `Binder` 本身没有直接接受集合的构造方法,但可以通过自定义子类实现。 - 对于简单场景,推荐使用 `Parcelable` 或 `Serializable` 传递集合。 - 跨进程通信时,需使用 `AIDL` 或 `Parcelable` 确保数据正确传输。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值