2017-09-06 110 views
0

这里是我的界面,我从Serializable接口扩展:java.io.NotSerializableException而传递接口通过intent.putExtra

public interface InstaListener extends Serializable { 
    void onSuccess(String response); 
    void onFailure(int code, String reason); 
} 

这里是如何,我传递了两个活动之间的这个监听器:

InstaListener iListener = new InstaListener() { 
      @Override 
      public void onSuccess(String response) { 

      } 

      @Override 
      public void onFailure(int code, String reason) { 

      } 
     }; 

Intent intent = new Intent(activity, Insta.class); 
      intent.putExtra("email", email); 
      intent.putExtra("phone", phone); 
      intent.putExtra("purpose", purpose); 
      intent.putExtra("amount", amountstr); 
      intent.putExtra("name", name); 
      intent.putExtra("env", env); 
      intent.putExtra("listener", iListener); 
      activity.startActivity(intent); 

这里的我如何接收Insta班的听众。

instaListener = (InstaListener) getIntent().getSerializableExtra("listener"); 

我已经搜索很多帖子,但没有解释为什么我得到的错误: java.io.NotSerializableException

任何帮助吗?

编辑 发布异常和堆栈跟踪

FATAL EXCEPTION: main 
                   Process: instamojo.testapp, PID: 6785 
                   java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = instamojo.library.InstamojoPay$1) 
                    at android.os.Parcel.writeSerializable(Parcel.java:1527) 
                    at android.os.Parcel.writeValue(Parcel.java:1475) 
                    at android.os.Parcel.writeArrayMapInternal(Parcel.java:724) 
                    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408) 
                    at android.os.Bundle.writeToParcel(Bundle.java:1157) 
                    at android.os.Parcel.writeBundle(Parcel.java:764) 
                    at android.content.Intent.writeToParcel(Intent.java:8687) 
                    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3271) 
                    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1691) 
                    at android.app.Activity.startActivityForResult(Activity.java:4291) 
                    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 
                    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 
                    at android.app.Activity.startActivityForResult(Activity.java:4249) 
                    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
                    at android.app.Activity.startActivity(Activity.java:4603) 
                    at android.app.Activity.startActivity(Activity.java:4563) 
                    at instamojo.library.InstamojoPay.initInstamojo(InstamojoPay.java:61) 
                    at instamojo.library.InstamojoPay.start(InstamojoPay.java:34) 
                    at instamojo.testapp.MainActivity.callInstamojoPay(MainActivity.java:58) 
                    at instamojo.testapp.MainActivity.access$000(MainActivity.java:17) 
                    at instamojo.testapp.MainActivity$1.onClick(MainActivity.java:39) 
                    at android.view.View.performClick(View.java:5669) 
                    at android.view.View$PerformClick.run(View.java:22549) 
                    at android.os.Handler.handleCallback(Handler.java:751) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6290) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                    Caused by: java.io.NotSerializableException: instamojo.library.InstamojoPay 
                    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224) 
                    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584) 
                    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549) 
                    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472) 
                    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218) 
                    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
                    at android.os.Parcel.writeSerializable(Parcel.java:1522) 
                    at android.os.Parcel.writeValue(Parcel.java:1475)  
                    at android.os.Parcel.writeArrayMapInternal(Parcel.java:724)  
                    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)  
                    at android.os.Bundle.writeToParcel(Bundle.java:1157)  
                    at android.os.Parcel.writeBundle(Parcel.java:764)  
                    at android.content.Intent.writeToParcel(Intent.java:8687)  
                    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3271)  
                    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1691)  
                    at android.app.Activity.startActivityForResult(Activity.java:4291)  
                    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)  
                    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)  
                    at android.app.Activity.startActivityForResult(Activity.java:4249)  
                    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)  
                    at android.app.Activity.startActivity(Activity.java:4603)  
                    at android.app.Activity.startActivity(Activity.java:4563)  
                    at instamojo.library.InstamojoPay.initInstamojo(InstamojoPay.java:61)  
                    at instamojo.library.InstamojoPay.start(InstamojoPay.java:34)  
                    at instamojo.testapp.MainActivity.callInstamojoPay(MainActivity.java:58)  
                    at instamojo.testapp.MainActivity.access$000(MainActivity.java:17)  
                    at instamojo.testapp.MainActivity$1.onClick(MainActivity.java:39)  
                    at android.view.View.performClick(View.java:5669)  
                    at android.view.View$PerformClick.run(View.java:22549)  
                    at android.os.Handler.handleCallback(Handler.java:751)  
                    at android.os.Handler.dispatchMessage(Handler.java:95)  
                    at android.os.Looper.loop(Looper.java:154)  
                    at android.app.ActivityThread.main(ActivityThread.java:6290)  
                    at java.lang.reflect.Method.invoke(Native Method)  
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
+0

在您的问题中发布整个异常和堆栈跟踪。 – EJP

+0

编辑&添加异常和堆栈跟踪 – user1051505

回答

1

你的方法和本地的InstaListener实施是一个内部类的instamojo.library.InstamojoPay,这是不Serializable。您可能不希望它是可序列化的,因此解决方案是将您的InstaListener实现编写为静态嵌套类,而不是方法本地内部类。

+0

这解决了它。问题:我无法从静态类中访问getApplicationContext()。我需要在回调中更新UI线程。 – user1051505

0

你有一个内部类的instamojo.library.InstamojoPay,它不是序列化。

为了避免这种情况的例外,添加java.io.Serializable到您的内部类或添加transient关键字到您的内部类对象的声明

+0

我做到了:public class InstamojoPay实现可序列化 - 它没有帮助 – user1051505

+0

@ user1051505它确实有帮助。你没有得到相同的错误信息。你遇到了一个不同的不可序列化的类。但是,使所有内容都可见Serializable不是正确的答案。 – EJP