0

我正在尝试实现一个服务,并且我的服务中有一个 classCastException。由于位置不是 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);
        }
    }
}

那么为什么这里会出现这种演员阵容,我该如何解决呢?

提前致谢

4

1 回答 1

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);
    }
}
于 2012-06-30T06:05:06.300 回答