我正在尝试实现一个服务,我的服务中有一个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);
}
}
}
那么为什么会出现这种情况,我该如何解决呢?
提前致谢
答案 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);
}
}