这是我的接口类
interface InstallerInterface {
fun onInstallation(context: Context)
}
我在这个类中实现了接口。
class FirstActivity : InstallerInterface{
override fun onInstallation(context: Context) {
*MyCode*
}
}
我已经尝试使用意图来传递这个上下文
val intent=Intent(context,SecondActivity::class.java)
intent.putExtra("NAME",name)
intent.putExtra("Callback",Interface)
context.startActivity(intent)
但是intent.putExtra导致了错误Cannot resolve method 'putExtra()
。所以我在FirstActivity()
类中实现了Serializable
。但这导致了错误
06-11 12:28:57.323 4042 4042 E AndroidRuntime: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = FirstAcitvity)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Parcel.writeSerializable(Parcel.java:1535)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Parcel.writeValue(Parcel.java:1483)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Parcel.writeArrayMapInternal(Parcel.java:732)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1417)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Bundle.writeToParcel(Bundle.java:1157)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Parcel.writeBundle(Parcel.java:772)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.content.Intent.writeToParcel(Intent.java:8703)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3082)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1520)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.Activity.startActivityForResult(Activity.java:4229)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.Activity.startActivityForResult(Activity.java:4187)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.Activity.startActivity(Activity.java:4526)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.Activity.startActivity(Activity.java:4494)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at foundation.e.apps.XAPK.LaunchUtils.startInstallSplitApksActivity(LaunchUtils.kt:15)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at foundation.e.apps.XAPK.ViewUtils$installXApk$1.onCompedApks(ViewUtils.kt:57)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at foundation.e.apps.XAPK.XApkInstallUtils$installSplitApks$2.run(XApkInstallUtils.kt:191)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:751)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6186)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: Caused by: java.io.NotSerializableException: ThirdAcivity()
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
06-11 12:28:57.323 4042 4042 E AndroidRuntime: at android.os.Parcel.writeSerializable(Parcel.java:1530)
06-11 12:28:57.323 4042
我相信ThirdActivity()
实现了FirstActivity()
,而我没有在ThirdAcivity
中实现Serializable
。所以我用ThirdAcitivity
实现了Serializable
。而且我在使用FirstAcivity
的每个活动中都会遇到错误。这是一个很大的项目,我不能在每一个活动上都实现Serializable
。所以我实现了Parcelable
。我的代码是
@Parcelize
class FirstActivity : InstallerInterface, Parcelable{
override fun onInstallation(context: Context) {
*MyCode*
}
}
我收到了像java.lang.RuntimeException: Parcel: unable to marshal value
这样的错误,我该如何修复这段代码。如果不是,还有什么更好的选择呢?提前谢谢你
发布于 2020-06-11 16:10:09
你的活动不应该实现Parcelable/Serializable
。此外,传递活动引用可能会导致内存泄漏和应用程序崩溃(https://proandroiddev.com/everything-you-need-to-know-about-memory-leaks-in-android-d7a59faaf46a、https://techbeacon.com/app-dev-testing/what-you-need-know-about-android-app-memory-leaks)
如果您想在另一个活动中执行某些操作并将结果返回给第一个活动,您可以使用startActivityForResult
或新的Activity Result APIs
。更多信息https://developer.android.com/training/basics/intents/result
发布于 2021-09-08 07:52:06
您不能“传递接口”。“接口”是一个抽象的东西。您想要传递的是该接口的具体实现,即:一个对象(恰好实现您的接口)。当您实例化您的“接口”时(在您的示例中,如下所示:
intent.putExtra("testInterface", new ITest() {
@Override
void onSuccess(String text) {
}
}
然而,即使你这样做了,它也不会解决你的问题。您需要了解的是,您不能通过将对象(实例)作为“附加内容”放在Intent中来传递它们。当你这样做的时候,Android实际上会对对象进行序列化和反序列化,这样你就会得到两个对象,其中一个是原始对象的序列化/反序列化副本。
https://stackoverflow.com/questions/62319369
复制相似问题