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 附加功能一起使用要快得多。就个人而言,我永远不会梦想使用带有ParcelableSerializable 的匿名内部类。 我这样做是因为我想将行为传递给我的活动,以便执行。所以我做了一个接口并将它的子类传递给活动来执行某个方法。由于我只需要这些子类一次,对于非常具体的事情,我决定使用匿名。这种方法到底有什么问题?我怎样才能做得更好? 更多细节:我的活动是一个“通用”活动,它只在后台执行某些操作时显示加载屏幕。这个要在后台执行的任务是我想要通过的。我可以考虑的另一个解决方案是传递某种标识符并使​​用类似开关盒的东西在活动中实例化相应的类。但是传递接口的实现会更优雅,因为这样我的活动就不必知道我正在传递的细节。 【参考方案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?

如何将匿名类型作为参数传递?

Intent传参数

Android:如何将参数传递给 AsyncTask 的 onPreExecute()?

Android 将参数传递给 TimerTask 扩展类

Android:如何将参数传递给AsyncTask的onPreExecute()?