【问题标题】:Wrong type of parameter passed传递的参数类型错误
【发布时间】:2018-03-29 21:52:42
【问题描述】:

我有一个 base 模块,在这个模块中我有一个接口:

interface BaseNavigationInterface : Serializable{

fun onItemClicked(navItemId: Int)
}

我有一个 market 模块,在这个模块中我有一个使用这个静态方法的活动:

companion object {
    @JvmStatic
    fun newIntent(context: Context, navInterface: BaseNavigationInterface) : Intent {
        var intent = Intent(context, MarketActivity::class.java)
        intent.putExtra("interface", navInterface)
        return intent
    }
}

在我的另一个模块(这是 app 模块)中,我想像这样启动 market 模块:

startActivity(MarketActivity.newIntent(this, navigationInterface));

navigationInterface 是我活动中的一个类变量:

private BaseNavigationInterface navigationInterface = (BaseNavigationInterface)(new BaseNavigationInterface() {
    @Override
    public void onItemClicked(int navItemId) {

    }
});

我的问题是,当我的程序调用 startActivity() 方法并调用 MarketActivity.newIntent() 方法时,navigationInterface 参数的类型是 MainActivity。 为什么?

我遇到了这个异常:

java.lang.RuntimeException: Parcelable 遇到写入可序列化对象的 IOException (name = my.app.activities.MainActivity$9)

纯 kotlin 项目中的相同代码运行良好,但现在我有一个混合项目。 (app模块是java,oders是kotlin模块)

【问题讨论】:

  • 我不确定让你的接口 BaseNavigationInterface 继承 Serializable 真的让它可序列化 cf。 doc : '只有当它扩展的类具有可访问的无参数构造函数来初始化类的状态时,子类型才能承担此责任。如果不是这种情况,则声明一个类 Serializable 是错误的。 developer.android.com/reference/java/io/Serializable.html

标签: android kotlin


【解决方案1】:

如果你想要一个可序列化的回调,你可以使用https://developer.android.com/reference/android/os/ResultReceiver.html

ResultReceiver receiver = new ResultReceiver(new Handler()) {
    protected void onReceiveResult(int resultCode, Bundle resultData) {
       val navItemId: Int = resultData.get...
    }
}

intent.putExtra("interface", receiver )

【讨论】:

  • 我不想要一个可序列化的回调,我只想找到在没有循环依赖的模块之间进行通信的最佳方式。您知道对此有更好的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 2021-07-20
  • 2015-12-22
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
相关资源
最近更新 更多