当前位置: 首页 > 面试题库 >

每次我声明并运行两个服务时,都获取java.lang.ClassCastException:android.os.BinderProxy

李宜然
2023-03-14
问题内容

每次我声明并运行两个服务时,我都遇到以下binder.proxy异常。一个服务在不同的进程中运行(专用于应用程序),另一项服务在与我的应用程序在同一应用程序(默认应用程序进程)中使用Binder实现运行的进程中运行。

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.service.check"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:name="com.service.check.MainApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

         <service
            android:name="com.service.check.SecondService"
            android:exported="false"/>

        <service
            android:name="com.service.check.FirstService"
            android:process=":newProcess" >
        </service>
    </application>

</manifest>

我在MainActivity上的第一个按钮上单击启动我的第一个服务:

MainActivity.java

public class MainActivity extends ActionBarActivity implements OnClickListener {

    private Button mLanchServiceBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLanchServiceBtn=(Button) findViewById(R.id.launch_btn);

        mLanchServiceBtn.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
       //Starting first service
        Intent launch=new Intent(this,FirstService.class);
        startService(launch);

    }
}

与MainApplication类中的第二项服务相同。

MainApplication.java

    public class MainApplication extends Application {

        private SecondService.LocalBinder mBinder;
        private ServiceConnection mConnection = new ServiceConnection() {

            @Override
            public void onServiceConnected(ComponentName className, IBinder service) {
                mBinder = (LocalBinder) service;
            }

            @Override
            public void onServiceDisconnected(ComponentName arg0) {
            }
        };

        @Override
        public void onCreate() {
            super.onCreate();

            //starting second service               
            Intent launch=new Intent(this,SecondService.class);
            startService(launch);

            //Binding to it 
            bindService(launch, mConnection, BIND_AUTO_CREATE);
        }

    }

FirstService.java

public class FirstService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

SecondService.java

public class SecondService extends Service{

    //Service Containing Local Binder
    private LocalBinder mBinder=new LocalBinder();
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    class LocalBinder extends Binder{

        public LocalBinder() {
        }
    }
}

堆栈跟踪:

 02-05 10:32:25.035: E/AndroidRuntime(1424): Process:

 com.service.check:newProcess, PID: 1424 02-05 10:32:25.035:
 E/AndroidRuntime(1424): java.lang.ClassCastException:
 android.os.BinderProxy cannot be cast to
 com.service.check.SecondService$LocalBinder 02-05 10:32:25.035:
 E/AndroidRuntime(1424):    at
 com.service.check.MainApplication$1.onServiceConnected(MainApplication.java:23)
 02-05 10:32:25.035: E/AndroidRuntime(1424):    at
 android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101)

我引用了以下链接来整理问题,即如果我的活动和服务处于单独的流程中,则我们不应束缚自己的工作方式。

Android服务android.os.BinderProxy错误

java.lang.ClassCastException:android.os.BinderProxy无法转换为LocalBinder

但以我 为例 我从 MainApplication 绑定到 SecondService
,并且两者都在同一进程(即默认应用程序进程)中运行。仍然我在 SecondService中 面临binderProxy异常,并且我的
FirstService 在一个甚至没有绑定到的单独进程中运行。

请帮助我解决这种情况,并建议我一种最佳的方式,这样我就可以实现相同的方案而不会崩溃。


问题答案:

经过研究和调试后找到了答案,

如果我们创建任何服务并将其绑定到MainApplication类(然后将服务绑定到整个ApplicationContext或BaseContext),并且如果同一个应用程序包含绑定到特定于活动的上下文的其他服务,

//Declared in MainApplication
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
                mBinder = (LocalBinder) service;
     }

在OnServiceConnected()中,我们将同时获取Services的绑定对象(在 MainApplication中
启动的SecondService(在BaseContext中注册)将获取本地bindObject)类和 FirstService
启动的MainActivity(将获取 android.os.binderProxyObject,从而导致ClassCastException )。

  • 因此,要 解决* 此问题,必须从任何活动上下文而不是使用任何全局应用程序上下文启动所有应用程序服务。此外,此问题与 流程 无关 *

  • 因此,我将SecondService和FirstService都移到了MainActivity Context中,从而解决了该问题。

MainActivity.java

    private Button mLanchServiceBtn;
    private SecondService.LocalBinder mBinder;
    private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName className, IBinder service) {
                mBinder = (LocalBinder) service;
            }
            @Override
            public void onServiceDisconnected(ComponentName arg0) {
            }
     };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            mLanchServiceBtn=(Button) findViewById(R.id.launch_btn);

            mLanchServiceBtn.setOnClickListener(this);



            //starting second service in activity

            Intent launch=new Intent(this,SecondService.class);
            startService(launch);

            //Binding to it 
            bindService(launch, mConnection, BIND_AUTO_CREATE);
        }


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }


        @Override
        public void onClick(View v) {

           //Starting FirstService also from MainActivity
            Intent launch=new Intent(this,FirstService.class);
            startService(launch);

        }
    }


 类似资料:
  • 问题内容: 除了遍历声明了每个样式属性的数组外,还有什么方法可以获取dom元素所有样式的键/值输出? 问题答案: 有什么方法可以获取dom元素所有样式的键/值输出? 是的,但不要期望值(单位等)的确切处理是相同的跨浏览器。

  • 创建服务接口,接口必须继承IService。 注意:在异步编程里,异步转同步调用是非常糟糕的,并且有可能死锁。为了避免这个问题,Uragano不支持同步方法,所有的服务方法必须是异步的。 [ServiceDiscoveryName("RPC")] [ServiceRoute("hello")] public interface IHelloService : IService { [Ser

  • 简而言之,我有一个List userIds,它的大小可以从10k到100k,这些都是user_ids的,我的核心逻辑是,对于每user_id,我调用两个不同的rest api终端并获取这些有效负载,然后在有效负载之间进行验证操作 我通过以下方式使用executor服务来加快处理速度,我将记录拆分为批处理和预定义的100个线程,以便1个线程可以处理(int)(userIds.size()/100)个

  • 声明运行时异常的方法的指导原则是什么? 假设我调用一个抛出的第三方例程。该例程能够抛出而不声明它这样做是否允许/标准/可接受? 和往常一样,我对我的问题引起的困惑感到惊讶:-D这可能是因为我很困惑。 在下面的代码中,可调用的是一个lambda,它发出一个,这会抛出SQLException。callable.call抛出Exception。 我由此推测,程序员希望抛出一个SQLException。然

  • 在my provider:block中,我将一个VPC声明为VPC: 我怎样才能在我的资源块中获得这个专有网络的id/ARN/什么的?我有一个AWS云信息资源,我想把我的VPC id作为VpcId传递。有什么${self:}东西可以获取id吗? 我尝试了Ref: vpc,但那不起作用。

  • 我为PHP代码设置了一个Cron作业,使其每20分钟运行一次。但它每次都会杀死EC2T2Micro实例。以下是服务器日志。Pls帮助。 ip-172-31-42-52登录:[20332.164336]内存不足:杀死进程1241(java)得分174或牺牲子 [20332.192538]杀死进程1241(java)总计-VM:1473180KB,Anon-RSS:176012KB,文件-RSS:0K