Ok, tôi mới phát triển Android và đang cố gắng liên kết với dịch vụ để tôi có thể gọi các phương thức trên dịch vụ khi dịch vụ được bắt đầu. Hoạt động và Dịch vụ được mô tả bên dưới đều là một phần của cùng một ứng dụng nên không có bất kỳ sự cố nào ở đó, nhưng mỗi khi tôi chạy ứng dụng của mình, tôi nhận được lỗi sau:Trường hợp ngoại lệ ClassCast Android khi liên kết với dịch vụ
java.lang.ClassCastException: android.os.BinderProxy
dòng này xảy ra trên là:
LocalBinder binder = (LocalBinder) service;
đang Hoạt động của tôi (đơn giản là):
public class Main extends Activity {
boolean gpsBound = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
/** Called whenever the activity is started. */
@Override
protected void onStart() {
super.onStart();
// Bind to GPSService
Intent i = new Intent(this, GPSService.class);
startService(i);
bindService(i, connection, Context.BIND_AUTO_CREATE);
}
/** service binding */
private ServiceConnection connection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// After binding to GPSService get the instance of it returned by IBinder
LocalBinder binder = (LocalBinder) service;
gpsBound = true;
}
public void onServiceDisconnected(ComponentName className) {
gpsBound = false;
}
};
}
dịch vụ:
public class GPSService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public IBinder onBind(Intent i) {
// TODO Auto-generated method stub
return new LocalBinder<GPSService>(this);
}
/**
* Our implementation of LocationListener that handles updates given to us
* by the LocationManager.
*/
public class CustomLocationListener implements LocationListener {
DBHelper db;
CustomLocationListener() {
super();
}
// Overridden methods here...
}
}
Và cuối cùng LocalBinder tôi:
/**
* A generic implementation of Binder to be used for local services
* @author Geoff Bruckner 12th December 2009
*
* @param <S> The type of the service being bound
*/
public class LocalBinder<S> extends Binder {
private String TAG = "LocalGPSBinder";
private WeakReference<S> mService;
public LocalBinder(S service){
mService = new WeakReference<S>(service);
}
public S getService() {
return mService.get();
}
}
Tôi hiểu ý nghĩa của các ngoại lệ ClassCast nhưng không thể hiểu phải làm gì! Tôi đã làm theo các ví dụ trong tài liệu google nhưng nó vẫn không hoạt động. Bất cứ ai có thể làm sáng tỏ những gì có thể gây ra điều này?
Cảm ơn trước!
Bạn có nghĩa là: 'LocalBinder binder = (LocalBinder ) service;' Nếu vậy vẫn còn lỗi tương tự! –
Tôi đã nghiêng về việc đưa ra các generics hoàn toàn. Tôi sẽ chỉnh sửa trong một mẫu nhanh chóng sử dụng một boundService tôi đang viết ngay bây giờ. –
Sẽ có một bản thân mình mà không có generics nhưng nếu bạn có thể đưa ra một ví dụ đó sẽ là tuyệt vời!Cảm ơn, James –