Android Kotlin:同继承AppCompatActivity的两个子类如何强制转换
错误原因
你的UploadActivity和ParseUploadActivity是平级类,二者都直接继承AppCompatActivity,不存在父子继承关系,不同子类之间无法直接进行类型强转,强制转换必然抛出ClassCastException。
另外你注释的ParseUploadActivity().uploader(this, it1)写法也不可行:Activity实例必须由系统框架创建,手动new出来的Activity没有绑定上下文环境,无法正常执行相关逻辑。
解决方案
根据你的使用场景可选择以下三种方案:
方案1:抽取公共父类复用方法
如果两个Activity都需要用到uploader方法,可以先抽取公共父类,把通用方法放到父类中:
// 公共父类 open class BaseUploadActivity : AppCompatActivity() { fun uploader(context: Context, fileUri: Uri) { // 原有uploader方法的实现逻辑 } } // 修改两个Activity的继承关系 class UploadActivity : BaseUploadActivity() { // 原有代码不变,调用时直接写即可,无需强转 btnUploadImage.setOnClickListener { filePath?.let { it1 -> sm.uploadImage(this, it1) thread { Thread.sleep(1000) uploader(this, it1) } } } } class ParseUploadActivity : BaseUploadActivity() { // 原有代码不变 }
方案2:抽取工具类
如果uploader方法不需要绑定Activity的专属逻辑,可以直接抽为独立工具类:
object UploadUtil { fun uploader(context: Context, fileUri: Uri) { // 原有uploader方法的实现逻辑 } } // 调用处直接使用工具类即可 UploadUtil.uploader(this, it1)
方案3:跳转传参到ParseUploadActivity
如果你是需要跳转到ParseUploadActivity后执行上传逻辑,直接通过Intent传递Uri参数即可:
// UploadActivity中启动目标Activity并传参 val intent = Intent(this@UploadActivity, ParseUploadActivity::class.java) intent.putExtra("file_uri", it1.toString()) startActivity(intent) // ParseUploadActivity中接收参数并执行上传 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val uriStr = intent.getStringExtra("file_uri") val fileUri = Uri.parse(uriStr) uploader(this, fileUri) }
额外注意
你当前用Thread.sleep(1000)等待Firebase上传完成的逻辑不可靠,建议使用Firebase Storage的上传完成回调触发后续操作,避免因网络波动导致后续逻辑执行时上传还未完成。
内容的提问来源于stack exchange,提问作者totta
相关产品推荐
相关产品推荐

