Android 服务中可包裹对象的getExtra()上的classCastException
我试图实现一个服务,但我的服务中有一个classCastException。 由于位置不可包裹,我将其包装在ParcelableArrayList中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>(
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);
}
}