Android 服务中可包裹对象的getExtra()上的classCastException

Android 服务中可包裹对象的getExtra()上的classCastException,android,service,location,classcastexception,parcelable,Android,Service,Location,Classcastexception,Parcelable,我试图实现一个服务,但我的服务中有一个classCastException。 由于位置不可包裹,我将其包装在ParcelableArrayList中 public class GPSService extends Service { public void setLocation(Location location) { ArrayList<Location> locationArrayList = new ArrayList<Location>(

我试图实现一个服务,但我的服务中有一个classCastException。 由于位置不可包裹,我将其包装在ParcelableArrayList中

public class GPSService extends Service {
    public void setLocation(Location location) {
        ArrayList<Location> locationArrayList = new ArrayList<Location>(1);
        locationArrayList.add(location);
        Bundle b = new Bundle();
        b.putParcelableArrayList("location", locationArrayList);
        // try with an arrayList instead of just getExtra doesn't change anything :(
        ArrayList<GPSResultReceiver> resultReceiverArrayList = intent.getParcelableArrayListExtra("receiver");
        // this is a resultReceiver and not a GPSResultReceiver
        // where did the upcast happen?
        GPSResultReceiver receiver = resultReceiverArrayList.get(0);
        Log.d("ResultClass", receiver.getClass().toString());
        receiver.onReceiveResult(1111, b);
    }
那么,为什么会出现这种情况,我该如何处理


提前感谢

它看起来像预期的那样工作,因为ResultReceiver创建ResultReceiver,但不是它的子类。 这里的要点如下:实际上,服务中不需要GPSResultReceiver。只需ResultReceiver就足以将结果发送回,但您应该调用,但不能调用onReceiveResult。 因此,它看起来像

服务:

公共类GPSService扩展服务{
意向=无效;
ResultReceiver receiver=null;
@凌驾
公共IBinder onBind(最终目的arg0){
//TODO自动生成的方法存根
返回null;
}
@凌驾
开始时的公共无效(内容中的最终意图,最终int startId){
super.onStart(inIntent,startId);
this.intent=inIntent;
设置位置(空);
}
无效设置位置(最终位置){
最终ArrayList位置ArrayList=新ArrayList(1);
locationArrayList.add(位置);
最终捆绑包b=新捆绑包();
b、 putParcelableArrayList(“位置”,locationArrayList);
试一试{
this.receiver=this.intent.getParcelableExtra(“com.example.testservice.TestResultReceiver”);
}捕获(最终类CastException e){
Log.e(“GPSService”,“未能转换到GPSResultReceiver”,e);
}
试一试{
this.receiver=GPSResultReceiver.class.cast(this.intent.getParcelableExtra(“com.example.testservice.TestResultReceiver”);
}捕获(最终类CastException e){
Log.e(“GPSService”,“未能转换到GPSResultReceiver 2”,e);
}
Log.d(“ResultClass”,this.receiver.getClass().toString());
本.接收方.发送(1111,b);
}
}

看起来位置是可包裹状态“implements Parcelable”,ResultReceiver也是可包裹的。您的ClassCastException具体在哪里?GPSResultReceiver receiver=resultReceiverArrayList.get(0);您可以将其强制转换为Object,您将看到该类是ResultReceiver,而不是GPSResultReceiver。谢谢,您应该在文档中看到创建者。我还没有足够的声望,所以不能投票。
public class MyActivity extends Activity implements GPSResultReceiver.Receiver {
    void startService() {
        resultReceiver = new GPSResultReceiver(new Handler());
        resultReceiver.setReceiver(this);
        final Intent intent = new Intent(Intent.ACTION_SEND, null, this, GPSService.class);
        // intent.putExtra("receiver", resultReceiver);
        ArrayList<GPSResultReceiver> resultReceiverArrayList = new ArrayList<GPSResultReceiver>(1);
        resultReceiverArrayList.add(resultReceiver);
        intent.putParcelableArrayListExtra("receiver", resultReceiverArrayList);
        serviceRunning = true;
        startService(intent);
    }
public class GPSResultReceiver extends ResultReceiver {
    private Receiver resultReceiver;
    public GPSResultReceiver(Handler handler) {
        super(handler);
    }
    public void setReceiver(Receiver receiver) {
        resultReceiver = receiver;
    }
    public interface Receiver {
        public void onReceiveResult(int resultCode, Bundle resultData);
    }
    @Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
        if (resultReceiver != null) {
            resultReceiver.onReceiveResult(resultCode, resultData);
        }
    }
}
public class GPSService extends Service {

    Intent intent = null;
    ResultReceiver receiver = null;

    @Override
    public IBinder onBind(final Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onStart(final Intent inIntent, final int startId) {

        super.onStart(inIntent, startId);

        this.intent = inIntent;
        setLocation(null);
    }

    void setLocation(final Location location) {
        final ArrayList<Location> locationArrayList = new ArrayList<Location>(1);
        locationArrayList.add(location);
        final Bundle b = new Bundle();
        b.putParcelableArrayList("location", locationArrayList);

        try {
            this.receiver = this.intent.getParcelableExtra("com.example.testservice.TestResultReceiver");
        } catch (final ClassCastException e) {
            Log.e("GPSService", "Failed to cast to  GPSResultReceiver", e);
        }

        try {
            this.receiver = GPSResultReceiver.class.cast(this.intent.getParcelableExtra("com.example.testservice.TestResultReceiver"));
        } catch (final ClassCastException e) {
            Log.e("GPSService", "Failed to cast to  GPSResultReceiver 2", e);
        }

        Log.d("ResultClass", this.receiver.getClass().toString());
        this.receiver.send(1111, b);
    }
}