Android:将匿名类作为 Intent 参数传递的异常
Posted
技术标签:
【中文标题】Android:将匿名类作为 Intent 参数传递的异常【英文标题】:Android: Exception passing anonymous class as Intent parameter 【发布时间】:2012-05-24 04:42:07 【问题描述】:例外:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = MyClass$2)
(简化的)代码:
i.putExtra("myparam", generateA(context, "foo"));
...
private A generateA(final Context context, String foo)
return new A()
@Override
public void test()
System.out.println("test");
;
界面:
public interface A extends Serializable
public void test();
我做错了什么?我传递的是可序列化的。
【问题讨论】:
还有更多代码可以提供给我们吗...我看不到所提供的任何问题,或者发布堆栈跟踪 哦,好吧...我再次查看堆栈跟踪,原因是外部类不可序列化!所以我让它实现了可序列化。但是它有一个类 Handler 的实例变量,它是不可序列化的,现在它因此失败了。 请改用Parcelable
,因为它与Intent
附加功能一起使用要快得多。就个人而言,我永远不会梦想使用带有Parcelable
或Serializable
的匿名内部类。
我这样做是因为我想将行为传递给我的活动,以便执行。所以我做了一个接口并将它的子类传递给活动来执行某个方法。由于我只需要这些子类一次,对于非常具体的事情,我决定使用匿名。这种方法到底有什么问题?我怎样才能做得更好?
更多细节:我的活动是一个“通用”活动,它只在后台执行某些操作时显示加载屏幕。这个要在后台执行的任务是我想要通过的。我可以考虑的另一个解决方案是传递某种标识符并使用类似开关盒的东西在活动中实例化相应的类。但是传递接口的实现会更优雅,因为这样我的活动就不必知道我正在传递的细节。
【参考方案1】:
如果我理解得很好,意图失败是因为你的匿名类因为它的 Handler 而无法序列化?
是否可以在目标活动中实现您的处理程序? bahaviour 类应该只包含行为函数和目标活动提供的处理程序:
private transient Handler h;
//Called by the activity in the onCreate
void setHandler(Handler h)
this.h = h;
//Called by the activity to start the behaviour function
void startBehaviour ()
//...
//The activity handler will call startHandlerBehaviour itself
h.sendMessage();
//Called by the activity in the Handler to execute in the good context
void startHandlerBehaviour()
//...
【讨论】:
以上是关于Android:将匿名类作为 Intent 参数传递的异常的主要内容,如果未能解决你的问题,请参考以下文章
node-java 是不是允许将匿名函数作为参数传递给 java?