java.lang.ClassCastException: android.os.BinderProxy cannot be cast to ...

博客主要讲述了项目开发中Android进程间Service通信报错的问题。原因是进程间不能直接传递对象,指定android:process会导致进程间通信出错。解决办法有两种,一是去掉android:process=\remote\,二是采用aidl方式,包括创建aidl文件、重写Service的Binder方法和修改onServiceConnected。

        项目开发遇到下面这个报错了!

问题原因

        直接说原因,就是因为进程间不能直接传递对象,应该传递该Binder对象的映射(代理对象),所以类型转换就出错了。如果在同一个进程中,直接传递对象没有关系,下面的类型强转是没有问题的,但是如果是不同进程,强转就会失败,就会报上面的错误。

        那启动应用内启动service怎么就成进程间通信了呢?因为service是指定了android:process=":remote"。就算自己的service没有指定android:process,如果应用中其他service写了android:process,也会导致自己的service报错。

        我的Service是一个websocket通信服务,本来我把bindService写在Activity中,但是这有一个问题,就是页面跳转,服务会随着声明周期被销毁重建,这样每次跳转页面都重新连接,浪费时间,于是我就把Service挪到了Application里面。我的页面一个LoginActivity,一个MainActivity,页面跳转到MainActivity的时候就报错了,因为我的MainActivity里面使用了百度地图,而百度地图的service如下

<!--        百度地图定位的service组件-->
        <service android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote"/>

这样就导致我的Service的binder转换报错了。把百度地图Service里面的android:process=":remote"去掉就就可以了。

解决办法
一.去掉android:process=":remote"
二.aidl方式

        下面记录一下,进程间Service要想解决这个问题,就是需要用aidl方式。

1.创建aidl文件

        Android Studio可以直接创建,在与java文件平级的文件下会创建一个aidl文件夹,里面包名是app的包名,创建一个后缀为.aidl的文件夹

创建之后是这样的

aidl文件如下:

// IMyAidlInterface.aidl
package com.deviser.androidremote;

// Declare any non-default types here with import statements

interface IMyAidlInterface {
    //这用来传递Service的包名和文件名,传递之后通过反射获取Service对象
    String getName();
}

编译之后,build下面会生成

2.重写Service的Binder方法
//    //用于Activity和service通讯
      //这是原来的方法,直接把WebClientService这个对象返回了
//    public class WebClientBinder extends Binder {
//        public WebClientService getService() {
//            return WebClientService.this;
//        }
//    }


    //通过aidl方式,继承IMyAidlInterface.Stub,返回的是WebClientService的包名和文件名
    //进程间传递的是字符串
    public class WebClientBinder extends IMyAidlInterface.Stub{
        @Override
        public String getName() throws RemoteException {
            return WebClientService.class.getName();
        }
    }
3.修改onServiceConnected
    private var webServiceConnection: ServiceConnection = object : ServiceConnection {
        override fun onServiceConnected(componentName: ComponentName?, iBinder: IBinder?) {
              //原来就是这里iBinder强转成WebClientService.WebClientBinder报错
//            var binder: WebClientService.WebClientBinder = iBinder as WebClientService.WebClientBinder
//            webClientService = binder.service

            // 获得代理对象
            var proxy = IMyAidlInterface.Stub.asInterface(iBinder)
            try {
                //通过反射机制,把字符串转换成对象WebClientService对象
                var clazz = Class.forName(proxy.name)
                webClientService = clazz.newInstance() as WebClientService?
            }catch (e: Exception){
                e.printStackTrace()
            }
        }

        override fun onServiceDisconnected(componentName: ComponentName?) {
            Log.e(MyConstant.TAG,"服务与活动成功断开");
        }
    }

到这里,问题就解决啦!

2025-07-28 11:10:19.676 5188-5188 TransactionExecutor com.example.myapplication E Failed to execute the transaction: tId:-489014647 ClientTransaction{ tId:-489014647 transactionItems=[ tId:-489014647 LaunchActivityItem{activityToken=android.os.BinderProxy@b507644,intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.myapplication/.MainActivity },ident=210528473,info=ActivityInfo{421fde2 com.example.myapplication.MainActivity},curConfig={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h842dp 420dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 128 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.3 s.109 fontWeightAdjustment=0},overrideConfig={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h842dp 420dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 128 - 1080, 2337) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} as.3 s.3 fontWeightAdjustment=0},deviceId=0,referrer=com.android.shell,procState=2,state=null,persistentState=null,pendingResults=null,pendingNewIntents=null,sceneTransitionInfo=null,profilerInfo=null,assistToken=android.os.BinderProxy@4a532d7,shareableActivityToken=android.os.BinderProxy@91e57c4,activityWindowInfo=ActivityWindowInfo{isEmbedded=false, taskBounds=Rect(0, 0 - 1080, 2400), taskFragmentBounds=Rect(0, 0 - 1080, 2400)}} tId:-489014647 ResumeActivityItem{mActivityToken=android.os.BinderProxy@b507644,procState=-1,updateProcState=false,isForward=true,shouldSendCompatFakeFocus=false} tId:-489014647 Target activity: com.example.myapplication.MainActivity tId:-489014647 ] tId:-489014647 } 2025-07-28 11:10:19.677 5188-5188 AndroidRuntime com.example.myapplication D Shutting down VM 2025-07-28 11:10:19.678 5188-5188 AndroidRuntime com.example.myapplication E FATAL EXCEPTION: main Process: com.example.myapplication, PID: 5188 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.ClassCastException: com.google.android.material.textfield.MaterialAutoCompleteTextView cannot be cast to android.widget.Spinner at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4047) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4234) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:112) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:174) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:109) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:81) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2635) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loopOnce(Looper.java:232) at android.os.Looper.loop(Looper.java:317) at android.app.ActivityThread.main(ActivityThread.java:8699) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886) Caused by: java.lang.ClassCastException: com.google.android.material.textfield.MaterialAutoCompleteTextView cannot be cast to android.widget.Spinner at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:21) at android.app.Activity.performCreate(Activity.java:8980) at android.app.Activity.performCreate(Activity.java:8958) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1526) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4029) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4234)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:112)  at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:174)  at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:109)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:81)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2635)  at android.os.Handler.dispatchMessage(Handler.java:107)  at android.os.Looper.loopOnce(Looper.java:232)  at android.os.Looper.loop(Looper.java:317)  at android.app.ActivityThread.main(ActivityThread.java:8699)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886)  2025-07-28 11:10:19.776 5188-5193 e.myapplication com.example.myapplication I Compiler allocated 4219KB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
07-29
2025-09-03 20:41:06.091 718-744 AppHibernationService system_server E Package com.example.myapplication is not installed for user 0 2025-09-03 20:41:06.091 718-744 AppHibernationService system_server E Package com.example.myapplication is not installed for any user 2025-09-03 20:41:06.091 718-744 AppHibernationService system_server E Package com.example.myapplication is not installed for user 0 2025-09-03 20:41:06.091 718-744 AppHibernationService system_server E Package com.example.myapplication is not installed for any user 2025-09-03 20:54:02.033 718-858 InputDispatcher system_server E channel '6a720b8 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-03 21:00:20.868 718-858 InputDispatcher system_server E channel '207de1e com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-03 21:05:38.221 718-858 InputDispatcher system_server E channel 'c1f632b com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-07 20:44:52.229 1830-1942 .apps.wellbeing com.google.android.apps.wellbeing E Failed to open APK '/data/app/~~dJ88ZxVdANwbzdqaLfO8BA==/com.example.myapplication-Oci8KYGLbCHl-jUio4U6EQ==/base.apk': I/O error 2025-09-07 20:44:52.232 1830-1942 .apps.wellbeing com.google.android.apps.wellbeing E Failed to open APK '/data/app/~~dJ88ZxVdANwbzdqaLfO8BA==/com.example.myapplication-Oci8KYGLbCHl-jUio4U6EQ==/base.apk': I/O error 2025-09-07 20:44:52.232 1830-1942 ResourcesManager com.google.android.apps.wellbeing E failed to add asset path '/data/app/~~dJ88ZxVdANwbzdqaLfO8BA==/com.example.myapplication-Oci8KYGLbCHl-jUio4U6EQ==/base.apk' java.io.IOException: Failed to load asset path /data/app/~~dJ88ZxVdANwbzdqaLfO8BA==/com.example.myapplication-Oci8KYGLbCHl-jUio4U6EQ==/base.apk at android.content.res.ApkAssets.nativeLoad(Native Method) at android.content.res.ApkAssets.<init>(ApkAssets.java:322) at android.content.res.ApkAssets.loadFromPath(ApkAssets.java:171) at android.app.ResourcesManager.loadApkAssets(ResourcesManager.java:618) at android.app.ResourcesManager$ApkAssetsSupplier.load(ResourcesManager.java:287) at android.app.ResourcesManager.createAssetManager(ResourcesManager.java:714) at android.app.ResourcesManager.createResourcesImpl(ResourcesManager.java:801) at android.app.ResourcesManager.findOrCreateResourcesImplForKeyLocked(ResourcesManager.java:854) at android.app.ResourcesManager.createResources(ResourcesManager.java:1199) at android.app.ResourcesManager.getResources(ResourcesManager.java:1301) at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:2979) at android.app.ApplicationPackageManager.getResourcesForApplication(ApplicationPackageManager.java:2154) at android.app.ApplicationPackageManager.getResourcesForApplication(ApplicationPackageManager.java:2140) at android.app.ApplicationPackageManager.getText(ApplicationPackageManager.java:2481) at android.content.pm.PackageItemInfo.loadUnsafeLabel(PackageItemInfo.java:237) at android.content.pm.PackageItemInfo.loadLabel(PackageItemInfo.java:226) at android.app.ApplicationPackageManager.getApplicationLabel(ApplicationPackageManager.java:2526) at cut.c(PG:38) at cfv.apply(PG:391) at e$$ExternalSyntheticApiModelOutline1.m(D8$$SyntheticClass:47) at lcx.accept(PG:44) at j$.util.stream.M0.accept(SourceFile:3) at j$.util.D.x(SourceFile:24) at j$.util.T.forEachRemaining(SourceFile:24) at j$.util.stream.b.c(SourceFile:21) at j$.util.stream.b.y(SourceFile:8) at j$.util.stream.F.b(SourceFile:5) at j$.util.stream.b.f(SourceFile:35) at j$.util.stream.c1.collect(SourceFile:83) at bva.a(PG:99) at kbp.a(PG:301) at kbp.a(PG:38) at ltp.a(PG:3) at lsv.run(PG:19) at ltr.run(PG:5) at lrz.run(PG:17) at idd.run(PG:3) at loz.run(PG:50) at hsu.run(PG:768) at java.lang.Thread.run(Thread.java:1119) at ieo.run(PG:63) 2025-09-07 20:47:00.731 718-858 InputDispatcher system_server E channel 'd671972 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-07 20:52:16.888 718-858 InputDispatcher system_server E channel '54ceef5 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-10 08:19:19.039 718-858 InputDispatcher system_server E channel 'da9443c com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-10 08:28:44.520 718-858 InputDispatcher system_server E channel 'fb3dc4e com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-10 08:31:15.953 718-858 InputDispatcher system_server E channel '50c58e2 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-10 09:08:31.738 718-1763 TransitionController system_server E Set visible without transition ActivityRecord{10540855 u0 com.example.myapplication/.MainActivity t25} playing=true caller=com.android.server.wm.TaskFragment.resumeTopActivity:1629 2025-09-10 09:46:26.507 718-858 InputDispatcher system_server E channel 'dc063cb com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 08:57:50.144 718-858 InputDispatcher system_server E channel '1f6629d com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:00:15.359 718-858 InputDispatcher system_server E channel 'b8ebe12 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:08:43.780 718-858 InputDispatcher system_server E channel 'b3a4af9 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:09:46.460 718-858 InputDispatcher system_server E channel 'e65939a com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:10:18.549 718-858 InputDispatcher system_server E channel '97c3cce com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:10:20.415 718-858 InputDispatcher system_server E channel '4a4890c com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:15:34.082 718-858 InputDispatcher system_server E channel '5112bb7 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:20:13.015 718-858 InputDispatcher system_server E channel 'd3fcd81 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:21:45.786 718-858 InputDispatcher system_server E channel '83178b7 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-17 09:40:09.328 718-858 InputDispatcher system_server E channel 'b88d2d6 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-22 17:06:13.033 13959-13959 TransactionExecutor pid-13959 E Failed to execute the transaction: tId:-782804407 ClientTransaction{ tId:-782804407 transactionItems=[ tId:-782804407 LaunchActivityItem{activityToken=android.os.BinderProxy@be43358,intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 xflg=0x4 cmp=com.example.myapplication/.MainActivity },ident=184265485,info=ActivityInfo{a09354c com.example.myapplication.MainActivity},curConfig={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h914dp 420dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 0 - 1080, 2400) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.535 fontWeightAdjustment=0},overrideConfig={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h914dp 420dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 0 - 1080, 2400) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.2 fontWeightAdjustment=0},deviceId=0,referrer=com.android.shell,procState=2,state=null,persistentState=null,pendingResults=null,pendingNewIntents=null,sceneTransitionInfo=null,profilerInfo=null,assistToken=android.os.BinderProxy@456b8d9,shareableActivityToken=android.os.BinderProxy@615029e,activityWindowInfo=ActivityWindowInfo{isEmbedded=false, taskBounds=Rect(0, 0 - 1080, 2400), taskFragmentBounds=Rect(0, 0 - 1080, 2400)}} tId:-782804407 ResumeActivityItem{mActivityToken=android.os.BinderProxy@be43358,procState=-1,isForward=true,shouldSendCompatFakeFocus=false} tId:-782804407 Target activity: com.example.myapplication.MainActivity tId:-782804407 ] tId:-782804407 } 2025-09-22 17:06:13.036 13959-13959 AndroidRuntime pid-13959 E FATAL EXCEPTION: main Process: com.example.myapplication, PID: 13959 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageButton cannot be cast to android.widget.Button at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4280) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4467) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:222) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageButton cannot be cast to android.widget.Button at com.example.myapplication.MainActivity.setButtonListeners(MainActivity.java:107) at com.example.myapplication.MainActivity.onCreate(MainActivity.java:28) at android.app.Activity.performCreate(Activity.java:9155) at android.app.Activity.performCreate(Activity.java:9133) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1521) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4262) ... 13 more 2025-09-22 17:08:39.215 14080-14080 TransactionExecutor pid-14080 E Failed to execute the transaction: tId:1940201582 ClientTransaction{ tId:1940201582 transactionItems=[ tId:1940201582 LaunchActivityItem{activityToken=android.os.BinderProxy@7091517,intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 xflg=0x4 cmp=com.example.myapplication/.MainActivity },ident=36553713,info=ActivityInfo{8c6a69b com.example.myapplication.MainActivity},curConfig={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h914dp 420dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 0 - 1080, 2400) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.536 fontWeightAdjustment=0},overrideConfig={1.0 310mcc260mnc [en_US] ldltr sw411dp w411dp h914dp 420dpi nrml long port finger qwerty/v/v dpad/v winConfig={ mBounds=Rect(0, 0 - 1080, 2400) mAppBounds=Rect(0, 0 - 1080, 2400) mMaxBounds=Rect(0, 0 - 1080, 2400) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mActivityType=standard mAlwaysOnTop=undefined mRotation=ROTATION_0} as.2 s.2 fontWeightAdjustment=0},deviceId=0,referrer=com.android.shell,procState=2,state=null,persistentState=null,pendingResults=null,pendingNewIntents=null,sceneTransitionInfo=null,profilerInfo=null,assistToken=android.os.BinderProxy@a09354c,shareableActivityToken=android.os.BinderProxy@8f10995,activityWindowInfo=ActivityWindowInfo{isEmbedded=false, taskBounds=Rect(0, 0 - 1080, 2400), taskFragmentBounds=Rect(0, 0 - 1080, 2400)}} tId:1940201582 ResumeActivityItem{mActivityToken=android.os.BinderProxy@7091517,procState=-1,isForward=true,shouldSendCompatFakeFocus=false} tId:1940201582 Target activity: com.example.myapplication.MainActivity tId:1940201582 ] tId:1940201582 } 2025-09-22 17:08:39.218 14080-14080 AndroidRuntime pid-14080 E FATAL EXCEPTION: main Process: com.example.myapplication, PID: 14080 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageButton cannot be cast to android.widget.Button at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4280) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4467) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:222) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:133) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:103) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:80) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2823) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) Caused by: java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageButton cannot be cast to android.widget.Button at com.example.myapplication.MainActivity.setButtonListeners(MainActivity.java:107) at com.example.myapplication.MainActivity.onCreate(MainActivity.java:28) at android.app.Activity.performCreate(Activity.java:9155) at android.app.Activity.performCreate(Activity.java:9133) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1521) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4262) ... 13 more 2025-09-22 17:16:44.788 14174-14174 AndroidRuntime pid-14174 E FATAL EXCEPTION: main Process: com.example.myapplication, PID: 14174 java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageButton cannot be cast to android.widget.TextView at com.example.myapplication.MainActivity.lambda$setButtonListeners$0$com-example-myapplication-MainActivity(MainActivity.java:41) at com.example.myapplication.MainActivity$$ExternalSyntheticLambda0.onClick(D8$$SyntheticClass:0) at android.view.View.performClick(View.java:8083) at android.view.View.performClickInternal(View.java:8060) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:31549) at android.os.Handler.handleCallback(Handler.java:995) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) 2025-09-22 17:16:44.809 718-858 InputDispatcher system_server E channel '15505d9 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-22 17:23:26.582 718-858 InputDispatcher system_server E channel '7ce91bf com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-22 17:23:49.591 14368-14368 AndroidRuntime pid-14368 E FATAL EXCEPTION: main Process: com.example.myapplication, PID: 14368 java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageButton cannot be cast to android.widget.TextView at com.example.myapplication.MainActivity.lambda$setButtonListeners$0$com-example-myapplication-MainActivity(MainActivity.java:41) at com.example.myapplication.MainActivity$$ExternalSyntheticLambda0.onClick(D8$$SyntheticClass:0) at android.view.View.performClick(View.java:8083) at android.view.View.performClickInternal(View.java:8060) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:31549) at android.os.Handler.handleCallback(Handler.java:995) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loopOnce(Looper.java:248) at android.os.Looper.loop(Looper.java:338) at android.app.ActivityThread.main(ActivityThread.java:9067) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932) 2025-09-22 17:23:49.608 718-858 InputDispatcher system_server E channel '9cce75c com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-22 17:32:56.477 14730-14730 e.myapplication com.example.myapplication I Late-enabling -Xcheck:jni 2025-09-22 17:32:56.504 14730-14730 e.myapplication com.example.myapplication I Using CollectorTypeCMC GC. 2025-09-22 17:32:56.505 14730-14730 e.myapplication com.example.myapplication W Unexpected CPU variant for x86: x86_64. Known variants: atom, sandybridge, silvermont, goldmont, goldmont-plus, goldmont-without-sha-xsaves, tremont, kabylake, alderlake, default 2025-09-22 17:32:56.517 14730-14730 nativeloader com.example.myapplication D Load libframework-connectivity-tiramisu-jni.so using APEX ns com_android_tethering for caller /apex/com.android.tethering/javalib/framework-connectivity-t.jar: ok 2025-09-22 17:32:56.731 14730-14730 nativeloader com.example.myapplication D Configuring clns-9 for other apk /data/app/~~BU8Zpa-Ptb6zWCD1jUuDVQ==/com.example.myapplication-bvhvD7PKJdnssUQso6AYEw==/base.apk. target_sdk_version=36, uses_libraries=, library_path=/data/app/~~BU8Zpa-Ptb6zWCD1jUuDVQ==/com.example.myapplication-bvhvD7PKJdnssUQso6AYEw==/lib/x86_64:/data/app/~~BU8Zpa-Ptb6zWCD1jUuDVQ==/com.example.myapplication-bvhvD7PKJdnssUQso6AYEw==/base.apk!/lib/x86_64, permitted_path=/data:/mnt/expand:/data/user/0/com.example.myapplication 2025-09-22 17:32:56.737 14730-14730 e.myapplication com.example.myapplication I AssetManager2(0x79d591a4c758) locale list changing from [] to [en-US] 2025-09-22 17:32:56.744 14730-14730 GraphicsEnvironment com.example.myapplication V Currently set values for: 2025-09-22 17:32:56.744 14730-14730 GraphicsEnvironment com.example.myapplication V angle_gl_driver_selection_pkgs=[] 2025-09-22 17:32:56.744 14730-14730 GraphicsEnvironment com.example.myapplication V angle_gl_driver_selection_values=[] 2025-09-22 17:32:56.744 14730-14730 GraphicsEnvironment com.example.myapplication V com.example.myapplication is not listed in per-application setting 2025-09-22 17:32:56.744 14730-14730 GraphicsEnvironment com.example.myapplication V ANGLE allowlist from config: com.dreamgames.royalmatch com.dts.freefiremax com.dxx.firenow com.gramgames.mergedragons com.ludo.king com.mojang.minecraftpe com.my.defense com.nintendo.zaka com.os.airforce com.playrix.fishdomdd.gplay io.teslatech.callbreak jp.konami.prospia net.peakgames.toonblast 2025-09-22 17:32:56.744 14730-14730 GraphicsEnvironment com.example.myapplication V com.example.myapplication is not listed in ANGLE allowlist or settings, returning default 2025-09-22 17:32:56.745 14730-14730 GraphicsEnvironment com.example.myapplication V Neither updatable production driver nor prerelease driver is supported. 2025-09-22 17:32:56.799 14730-14766 DisplayManager com.example.myapplication I Choreographer implicitly registered for the refresh rate. 2025-09-22 17:32:56.802 14730-14730 e.myapplication com.example.myapplication I AssetManager2(0x79d591a488d8) locale list changing from [] to [en-US] 2025-09-22 17:32:56.834 14730-14766 EGL_emulation com.example.myapplication I Opening libGLESv1_CM_emulation.so 2025-09-22 17:32:56.835 14730-14766 EGL_emulation com.example.myapplication I Opening libGLESv2_emulation.so 2025-09-22 17:32:56.841 14730-14766 HWUI com.example.myapplication W Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 2025-09-22 17:32:56.841 14730-14766 HWUI com.example.myapplication W Failed to initialize 101010-2 format, error = EGL_SUCCESS 2025-09-22 17:32:56.881 14730-14730 AppCompatDelegate com.example.myapplication D Checking for metadata for AppLocalesMetadataHolderService : Service not found 2025-09-22 17:32:56.883 14730-14730 e.myapplication com.example.myapplication I AssetManager2(0x79d591a4f638) locale list changing from [] to [en-US] 2025-09-22 17:32:56.894 14730-14730 ashmem com.example.myapplication E Pinning is deprecated since Android Q. Please use trim or other methods. 2025-09-22 17:32:56.978 14730-14730 e.myapplication com.example.myapplication I hiddenapi: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (runtime_flags=0, domain=platform, api=unsupported) from Landroidx/appcompat/widget/ViewUtils; (domain=app) using reflection: allowed 2025-09-22 17:32:57.083 14730-14730 CompatChangeReporter com.example.myapplication D Compat change id reported: 377864165; UID 10217; state: ENABLED 2025-09-22 17:32:57.085 14730-14730 DesktopModeFlags com.example.myapplication D Toggle override initialized to: OVERRIDE_UNSET 2025-09-22 17:32:57.137 14730-14730 HWUI com.example.myapplication W Image decoding logging dropped! 2025-09-22 17:32:57.143 14730-14730 e.myapplication com.example.myapplication I hiddenapi: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (runtime_flags=0, domain=platform, api=unsupported) from Landroidx/appcompat/widget/ViewUtils; (domain=app) using reflection: allowed 2025-09-22 17:32:57.205 14730-14730 HWUI com.example.myapplication W Unknown dataspace 0 2025-09-22 17:32:57.499 14730-14730 InsetsController com.example.myapplication D hide(ime(), fromIme=false) 2025-09-22 17:32:57.499 14730-14730 ImeTracker com.example.myapplication I com.example.myapplication:120293d6: onCancelled at PHASE_CLIENT_ALREADY_HIDDEN 2025-09-22 17:32:57.728 14730-14735 e.myapplication com.example.myapplication I Compiler allocated 5042KB to compile void android.view.ViewRootImpl.performTraversals() 2025-09-22 17:33:01.507 14730-14744 HWUI com.example.myapplication I Davey! duration=701ms; Flags=0, FrameTimelineVsyncId=339287, IntendedVsync=12434071552112, Vsync=12434071552112, InputEventId=0, HandleInputStart=12434073050000, AnimationStart=12434073070200, PerformTraversalsStart=12434073339500, DrawStart=12434073461500, FrameDeadline=12434104885444, FrameStartTime=12434073038200, FrameInterval=16666666, WorkloadTarget=16666666, SyncQueued=12434073835100, SyncStart=12434073973100, IssueDrawCommandsStart=12434074070700, SwapBuffers=12434077768700, FrameCompleted=12434772941900, DequeueBufferDuration=51900, QueueBufferDuration=249800, GpuCompleted=12434772941900, SwapBuffersCompleted=12434078695800, DisplayPresentTime=0, CommandSubmissionCompleted=12434077768700, 2025-09-22 17:33:01.516 14730-14730 Choreographer com.example.myapplication I Skipped 41 frames! The application may be doing too much work on its main thread. 2025-09-22 17:33:01.525 14730-14730 AssistStructure com.example.myapplication I Flattened final assist data: 3948 bytes, containing 1 windows, 27 views 2025-09-22 17:33:03.060 14730-14782 ProfileInstaller com.example.myapplication D Installing profile for com.example.myapplication 2025-09-22 17:34:16.254 718-858 InputDispatcher system_server E channel 'c4201b3 com.example.myapplication/com.example.myapplication.MainActivity' ~ Channel is unrecoverably broken and will be disposed! 2025-09-22 17:34:17.321 14830-14830 e.myapplication com.example.myapplication I Late-enabling -Xcheck:jni 2025-09-22 17:34:17.358 14830-14830 e.myapplication com.example.myapplication I Using CollectorTypeCMC GC. 2025-09-22 17:34:17.359 14830-14830 e.myapplication com.example.myapplication W Unexpected CPU variant for x86: x86_64. Known variants: atom, sandybridge, silvermont, goldmont, goldmont-plus, goldmont-without-sha-xsaves, tremont, kabylake, alderlake, default 2025-09-22 17:34:17.372 14830-14830 nativeloader com.example.myapplication D Load libframework-connectivity-tiramisu-jni.so using APEX ns com_android_tethering for caller /apex/com.android.tethering/javalib/framework-connectivity-t.jar: ok 2025-09-22 17:34:17.419 14830-14830 nativeloader com.example.myapplication D Load /data/user/0/com.example.myapplication/code_cache/startup_agents/3fc68f17-agent.so using system ns (caller=<unknown>): ok 2025-09-22 17:34:17.415 14830-14830 re-initialized> com.example.myapplication W type=1400 audit(0.0:2120): avc: granted { execute } for path="/data/data/com.example.myapplication/code_cache/startup_agents/3fc68f17-agent.so" dev="dm-55" ino=352933 scontext=u:r:untrusted_app:s0:c217,c256,c512,c768 tcontext=u:object_r:app_data_file:s0:c217,c256,c512,c768 tclass=file app=com.example.myapplication 2025-09-22 17:34:17.427 14830-14830 e.myapplication com.example.myapplication W hiddenapi: DexFile /data/data/com.example.myapplication/code_cache/.studio/instruments-c9b0d10a.jar is in boot class path but is not in a known location 2025-09-22 17:34:17.587 14830-14830 e.myapplication com.example.myapplication W Redefining intrinsic method java.lang.Thread java.lang.Thread.currentThread(). This may cause the unexpected use of the original definition of java.lang.Thread java.lang.Thread.currentThread()in methods that have already been compiled. 2025-09-22 17:34:17.587 14830-14830 e.myapplication com.example.myapplication W Redefining intrinsic method boolean java.lang.Thread.interrupted(). This may cause the unexpected use of the original definition of boolean java.lang.Thread.interrupted()in methods that have already been compiled. 2025-09-22 17:34:17.743 14830-14830 nativeloader com.example.myapplication D Configuring clns-9 for other apk /data/app/~~BU8Zpa-Ptb6zWCD1jUuDVQ==/com.example.myapplication-bvhvD7PKJdnssUQso6AYEw==/base.apk. target_sdk_version=36, uses_libraries=, library_path=/data/app/~~BU8Zpa-Ptb6zWCD1jUuDVQ==/com.example.myapplication-bvhvD7PKJdnssUQso6AYEw==/lib/x86_64:/data/app/~~BU8Zpa-Ptb6zWCD1jUuDVQ==/com.example.myapplication-bvhvD7PKJdnssUQso6AYEw==/base.apk!/lib/x86_64, permitted_path=/data:/mnt/expand:/data/user/0/com.example.myapplication 2025-09-22 17:34:17.750 14830-14830 e.myapplication com.example.myapplication I AssetManager2(0x79d591a4c758) locale list changing from [] to [en-US] 2025-09-22 17:34:17.752 14830-14830 e.myapplication com.example.myapplication I AssetManager2(0x79d591a46fd8) locale list changing from [] to [en-US] 2025-09-22 17:34:17.760 14830-14830 GraphicsEnvironment com.example.myapplication V Currently set values for: 2025-09-22 17:34:17.761 14830-14830 GraphicsEnvironment com.example.myapplication V angle_gl_driver_selection_pkgs=[] 2025-09-22 17:34:17.761 14830-14830 GraphicsEnvironment com.example.myapplication V angle_gl_driver_selection_values=[] 2025-09-22 17:34:17.761 14830-14830 GraphicsEnvironment com.example.myapplication V com.example.myapplication is not listed in per-application setting 2025-09-22 17:34:17.761 14830-14830 GraphicsEnvironment com.example.myapplication V ANGLE allowlist from config: com.dreamgames.royalmatch com.dts.freefiremax com.dxx.firenow com.gramgames.mergedragons com.ludo.king com.mojang.minecraftpe com.my.defense com.nintendo.zaka com.os.airforce com.playrix.fishdomdd.gplay io.teslatech.callbreak jp.konami.prospia net.peakgames.toonblast 2025-09-22 17:34:17.761 14830-14830 GraphicsEnvironment com.example.myapplication V com.example.myapplication is not listed in ANGLE allowlist or settings, returning default 2025-09-22 17:34:17.762 14830-14830 GraphicsEnvironment com.example.myapplication V Neither updatable production driver nor prerelease driver is supported. 2025-09-22 17:34:17.810 14830-14845 DisplayManager com.example.myapplication I Choreographer implicitly registered for the refresh rate. 2025-09-22 17:34:17.813 14830-14830 e.myapplication com.example.myapplication I AssetManager2(0x79d591a4f638) locale list changing from [] to [en-US] 2025-09-22 17:34:17.842 14830-14845 EGL_emulation com.example.myapplication I Opening libGLESv1_CM_emulation.so 2025-09-22 17:34:17.842 14830-14845 EGL_emulation com.example.myapplication I Opening libGLESv2_emulation.so 2025-09-22 17:34:17.870 14830-14845 HWUI com.example.myapplication W Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 2025-09-22 17:34:17.870 14830-14845 HWUI com.example.myapplication W Failed to initialize 101010-2 format, error = EGL_SUCCESS 2025-09-22 17:34:17.889 14830-14830 AppCompatDelegate com.example.myapplication D Checking for metadata for AppLocalesMetadataHolderService : Service not found 2025-09-22 17:34:17.890 14830-14830 e.myapplication com.example.myapplication I AssetManager2(0x79d591a4da18) locale list changing from [] to [en-US] 2025-09-22 17:34:17.896 14830-14830 ashmem com.example.myapplication E Pinning is deprecated since Android Q. Please use trim or other methods. 2025-09-22 17:34:17.968 14830-14830 e.myapplication com.example.myapplication I hiddenapi: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (runtime_flags=0, domain=platform, api=unsupported) from Landroidx/appcompat/widget/ViewUtils; (domain=app) using reflection: allowed 2025-09-22 17:34:18.052 14830-14830 CompatChangeReporter com.example.myapplication D Compat change id reported: 377864165; UID 10217; state: ENABLED 2025-09-22 17:34:18.053 14830-14830 DesktopModeFlags com.example.myapplication D Toggle override initialized to: OVERRIDE_UNSET 2025-09-22 17:34:18.079 14830-14830 HWUI com.example.myapplication W Image decoding logging dropped! 2025-09-22 17:34:18.084 14830-14830 e.myapplication com.example.myapplication I hiddenapi: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (runtime_flags=0, domain=platform, api=unsupported) from Landroidx/appcompat/widget/ViewUtils; (domain=app) using reflection: allowed 2025-09-22 17:34:18.134 14830-14830 HWUI com.example.myapplication W Unknown dataspace 0 2025-09-22 17:34:18.402 14830-14830 InsetsController com.example.myapplication D hide(ime(), fromIme=false) 2025-09-22 17:34:18.403 14830-14830 ImeTracker com.example.myapplication I com.example.myapplication:a102fc0: onCancelled at PHASE_CLIENT_ALREADY_HIDDEN 2025-09-22 17:34:18.561 14830-14835 e.myapplication com.example.myapplication I Compiler allocated 5042KB to compile void android.view.ViewRootImpl.performTraversals() 2025-09-22 17:34:20.485 14830-14830 AssistStructure com.example.myapplication I Flattened final assist data: 3948 bytes, containing 1 windows, 27 views 2025-09-22 17:34:22.900 14830-14859 ProfileInstaller com.example.myapplication D Installing profile for com.example.myapplication
最新发布
09-23
### Android中SpannableString无法转换为String的类型转换异常问题 `java.lang.ClassCastException: android.text.SpannableString cannot be cast to java.lang.String` 是一种常见的运行时错误,当尝试将 `SpannableString` 对象强制转换为 `String` 类型时会发生此异常。这是因为 `SpannableString` 并不是一个继承自 `String` 的类,而是实现了 `CharSequence` 接口的一个独立实现。 以下是关于该问题的原因分析以及解决方案: #### 原因分析 在 Android 开发中,某些 UI 组件(如 `TextView` 或 `EditText`)可能会返回一个 `SpannableString` 而不是普通的 `String`。如果开发者未注意到这一点并试图直接将其强转为 `String`,就会抛出 `ClassCastException`[^1]。 --- #### 解决方案 ##### 方法一:调用 `toString()` 方法 可以直接通过调用 `SpannableString` 的 `toString()` 方法来获取其对应的字符串表示形式。这种方式简单有效,适用于大多数场景。 ```java // 获取 TextView 中的内容 CharSequence charSequence = textView.getText(); if (charSequence instanceof SpannableString) { String result = ((SpannableString) charSequence).toString(); } ``` 这种方法不会引发任何类型的转换异常,并能正确提取原始文本内容[^2]。 --- ##### 方法二:判断对象类型后再处理 为了避免潜在的类型不匹配问题,在操作之前可以先检查对象的具体类型。这样可以在不同情况下采取不同的逻辑分支。 ```java CharSequence textContent = editText.getText(); // 可能是 SpannableString 或其他 CharSequence 实现 if (textContent instanceof SpannableString) { String plainText = textContent.toString(); } else if (textContent instanceof String) { String plainText = (String) textContent; } else { throw new IllegalArgumentException("Unsupported type of content"); } ``` 这种做法增强了代码的安全性和可读性[^3]。 --- ##### 方法三:使用正则表达式或其他工具清理富文本标记 有时可能需要完全移除所有的样式信息而仅保留纯文本部分。可以通过正则表达式或者 HTML 工具库完成这一目标。 ```java import android.text.Html; public static String removeSpans(CharSequence input) { return Html.fromHtml(input.toString()).toString(); } // 使用方法 CharSequence originalContent = textView.getText(); String cleanedText = removeSpans(originalContent); ``` 这里利用了 `Html.fromHtml` 将复杂的字符序列简化成基础字符串形式[^4]。 --- ### 总结 针对 `android.text.SpannableString cannot be cast to java.lang.String` 这种异常情况,推荐优先采用 **方法一** 即调用 `toString()` 来解决问题;对于更复杂的需求,则可以选择结合条件判断或额外的数据清洗手段加以应对。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值