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

标签: java android serializable anonymous-class


【解决方案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() {
  //...
}

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 2019-11-23
    • 2011-05-11
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多