绑定到服务时出现Android ClassCast异常
好的,我是android开发的新手,正在尝试绑定到一个服务,以便在服务启动后可以调用该服务的方法。下面描述的活动和服务都是同一应用程序的一部分,因此不会出现任何问题,但每次运行应用程序时,我都会出现以下错误: java.lang.ClassCastException:android.os.BinderProxy 发生这种情况的线路是:绑定到服务时出现Android ClassCast异常,android,binding,service,android-activity,classcastexception,Android,Binding,Service,Android Activity,Classcastexception,好的,我是android开发的新手,正在尝试绑定到一个服务,以便在服务启动后可以调用该服务的方法。下面描述的活动和服务都是同一应用程序的一部分,因此不会出现任何问题,但每次运行应用程序时,我都会出现以下错误: java.lang.ClassCastException:android.os.BinderProxy 发生这种情况的线路是: LocalBinder binder = (LocalBinder) service; 我的活动代码(简化为): 服务: public class GPSSer
LocalBinder binder = (LocalBinder) service;
我的活动代码(简化为):
服务:
public class GPSService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent i) {
// TODO Auto-generated method stub
return new LocalBinder<GPSService>(this);
}
/**
* Our implementation of LocationListener that handles updates given to us
* by the LocationManager.
*/
public class CustomLocationListener implements LocationListener {
DBHelper db;
CustomLocationListener() {
super();
}
// Overridden methods here...
}
}
公共类GPSService扩展服务{
@凌驾
public void onCreate(){
super.onCreate();
}
@凌驾
公共IBinder onBind(意向一){
//TODO自动生成的方法存根
返回新的LocalBinder(此);
}
/**
*我们的LocationListener实现处理提供给我们的更新
*地点经理。
*/
公共类CustomLocationListener实现LocationListener{
dbdb;
CustomLocationListener(){
超级();
}
//这里重写的方法。。。
}
}
最后是我的LocalBinder:
/**
* A generic implementation of Binder to be used for local services
* @author Geoff Bruckner 12th December 2009
*
* @param <S> The type of the service being bound
*/
public class LocalBinder<S> extends Binder {
private String TAG = "LocalGPSBinder";
private WeakReference<S> mService;
public LocalBinder(S service){
mService = new WeakReference<S>(service);
}
public S getService() {
return mService.get();
}
}
/**
*用于本地服务的绑定器的通用实现
*@作者杰夫·布鲁克纳2009年12月12日
*
*@param要绑定的服务的类型
*/
公共类LocalBinder扩展了Binder{
私有字符串TAG=“LocalGPSBinder”;
私人WeakReference mService;
公共LocalBinder(S服务){
mService=新的WeakReference(服务);
}
公共服务{
返回mService.get();
}
}
我理解ClassCast异常的含义,但不明白该怎么做!我已经在谷歌文档中引用了这个例子,但它仍然不起作用。有人能解释一下是什么导致了这一切吗
提前谢谢 在ServiceConnected上传入的LocalBinder具有泛型类型参数,而您的局部变量
LocalBinder
没有泛型类型参数
通过从LocalBinder的定义中删除泛型类型,或在OnServiceConnectiond中向局部变量binder的声明中添加泛型类型,以这种或那种方式解决此问题
class MyBoundService extends Service{
private final IBinder mBinder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class MyBinder extends Binder{
public void doStuff(){
//Stuff
}
//More Binder Methods
}
}
class MyActivity extends Activity{
private MyBinder mBinder;
@Override
protected void onStart(){
Intent intent = new Intent(this, MyBoundService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop(){
unbindService(mConnection);
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mBinder = (TaskBinder) service;
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
private void doStuff(){
if (mBound)
mBinder.doStuff();
}
}
没有真正的需要去摆弄弱引用之类的东西。一定要解开(我没有在样本中)
如果您想尽快调用服务方法,只需在设置mBinder后将调用放入onServiceConnected即可。否则,只需从其他回调调用(onClick events等)。如果您试图绑定到本地服务,而不是yes,则可以强制转换它。但是,如果您试图绑定到远程(单独的进程)服务,则必须使用本文中规定的AIDL方法
删除服务的AndroidManifest.xml中的属性
过程
。也有相同的错误。我在清单中添加了android:process=“:process_description”属性。当您添加它时,您的服务被创建为单独的进程,因此您得到binderProxy的实例(因此类cast异常)您的意思是:‘LocalBinder=(LocalBinder)service;’如果是这样,仍然会出现相同的错误!我倾向于完全去掉仿制药。我将编辑一个我正在编写的boundService使用的快速示例。我将自己尝试一下,不使用泛型,但如果你能给出一个示例,那将是非常棒的!谢谢,JamesThat应该这样做(除非你真的需要IBinder中的泛型,这会有点奇怪))。您不需要在onStart/onStop中绑定/解除绑定。onCreate/onDestroy也可以正常工作,但您可能应该避免onResume/onPause,因为它们被调用的次数太多。仍然没有运气。您还有其他建议吗?好奇,有详细的原因吗?@ThomasDecaux我相信这是因为只有当服务与应用程序在同一进程(本地)中运行时,才可以使用LocalBinder。process属性为服务创建一个单独的进程来运行,因此,您必须使用IPC与之通信。在绑定过程中,Android为您提供了一个BinderProxy作为服务的桥梁,以便您可以实例化IPC类(用AIDL编写)。这是一根旧线,但这只救了我一命!接得好!事实上,你在没有OP发布他明显的天才的情况下就发现了这一点。谢谢如果我需要处理一个单独的流程,那么正确的方法是什么呢
class MyBoundService extends Service{
private final IBinder mBinder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class MyBinder extends Binder{
public void doStuff(){
//Stuff
}
//More Binder Methods
}
}
class MyActivity extends Activity{
private MyBinder mBinder;
@Override
protected void onStart(){
Intent intent = new Intent(this, MyBoundService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop(){
unbindService(mConnection);
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mBinder = (TaskBinder) service;
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
private void doStuff(){
if (mBound)
mBinder.doStuff();
}
}