来自服务中的Parcelable对象的getExtra()的classCastException

时间:2012-06-29 10:18:24

标签: android service location classcastexception parcelable

我正在尝试实现一个服务,我的服务中有一个classCastException。 由于Location不是Parcelable,我将它包装在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);
    }

我的活动如下:

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);
    }

我的GPSResultReceiver:

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);
        }
    }
}

那么为什么会出现这种情况,我该如何解决呢?

提前致谢

1 个答案:

答案 0 :(得分:0)

似乎它按预期工作,因为ResultReceiver的CREATOR创建了ResultReceiver,但不是它的子类。 这里的要点如下:实际上,您在服务中不需要GPSResultReceiver。只有ResultReceiver足以发回结果,但您应该调用public void send (int resultCode, Bundle resultData),而不是onReceiveResult。 所以,它看起来像是
服务:

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);
    }
}