0
나는 다음과 같은 추상 클래스가이 클래스는 두 개의 다른 클래스에 의해 확장일부 캐스팅 문제 :
public abstract class AbstractService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
:
public abstract class AbstractMessengerService extends AbstractService {
static final int MSG_REGISTER_CLIENT = 9991;
static final int MSG_UNREGISTER_CLIENT = 9992;
ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients.
final Messenger mMessenger = new Messenger(new IncomingHandler()); // Target we publish for clients to send messages to IncomingHandler.
private class IncomingHandler extends Handler { // Handler of incoming messages from clients.
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
Log.i("MyService", "Client registered: " + msg.replyTo);
mClients.add(msg.replyTo);
break;
case MSG_UNREGISTER_CLIENT:
Log.i("MyService", "Client un-registered: "+msg.replyTo);
mClients.remove(msg.replyTo);
break;
default:
//super.handleMessage(msg);
onReceiveMessage(msg);
}
}
}
@Override
public void onCreate() {
super.onCreate();
onStartService();
Log.i("MyService", "Service Started.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("MyService", "Received start id " + startId + ": " + intent);
return START_STICKY; // run until explicitly stopped.
}
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
@Override
public void onDestroy() {
super.onDestroy();
onStopService();
Log.i("MyService", "Service Stopped.");
}
protected void send(Message msg) {
for (int i=mClients.size()-1; i>=0; i--) {
try {
Log.i("MyService", "Sending message to clients: "+msg);
mClients.get(i).send(msg);
}
catch (RemoteException e) {
// The client is dead. Remove it from the list; we are going through the list from back to front so this is safe to do inside the loop.
Log.e("MyService", "Client is dead. Removing from list: "+i);
mClients.remove(i);
}
}
}
public abstract void onStartService();
public abstract void onStopService();
public abstract void onReceiveMessage(Message msg);
}
을 그리고 :
public abstract class AbstractAIDLService extends AbstractService {
private Handler handler;
ArrayList<Messenger> mClients = new ArrayList<Messenger>(); // Keeps track of all current registered clients.
private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
public int getPid(){
return android.os.Process.myPid();
}
@Override
public void setActivityColor(String color, long startTime) throws RemoteException {
long elpsedTime = (System.nanoTime() - startTime)/(1000 * 1000);
showElpesedTime(String.valueOf(elpsedTime));
}
public void basicTypes(int anInt, long aLong, boolean aBoolean,
float aFloat, double aDouble, String aString) {
// Does nothing
}
};
private void showElpesedTime(final String time)
{
handler.post(new Runnable() {
public void run() {
Toast toast = Toast.makeText(AbstractAIDLService.this, "Time passed reaching the server: "+time+"ms", Toast.LENGTH_SHORT);
toast.show();
}
});
}
@Override
public void onCreate() {
super.onCreate();
onStartService();
Log.i("MyService", "Service Started.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("MyService", "Received start id " + startId + ": " + intent);
return START_STICKY; // run until explicitly stopped.
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onDestroy() {
super.onDestroy();
onStopService();
Log.i("MyService", "Service Stopped.");
}
public abstract void onStartService();
public abstract void onStopService();
public abstract void onReceiveMessage(Message msg);
}
지금 나는 콘크리트를 만들 팩토리 클래스 인
ServiceManager
클래스를 생성 버전을 생성하여이 관리자 클래스에 전달했습니다.
public class ServiceManager {
private static final String TAG = ServiceManager.class.getSimpleName();
private Class<? extends AbstractService> mServiceClass;
public ServiceManager(Context context, ServiceType type, Class<? extends AbstractService> serviceClass, Handler incomingHandler) {
this.mActivity = context;
this.mIncomingHandler = incomingHandler;
if (type.equals(ServiceType.AIDL)) {
this.mServiceClass = (AbstractAIDLService) serviceClass;
} else if (type.equals(ServiceType.MESSENGER)) {
this.mServiceClass = (AbstractMessengerService) serviceClass;
}
if (isRunning()) {
doBindService();
}
}
그러나 어떤 이유로, 그 라인에 대한
:this.mServiceClass = (AbstractAIDLService) serviceClass;
,
this.mServiceClass = (AbstractMessengerService) serviceClass;
나에게 캐스팅 문제를주고 내가이 ServiceManager에있는 생성자를 가지고있다. 어떻게이 일을 할 수 있는지 아는 사람이 있습니까?
미리 감사드립니다.
네, 실제로이 작업을 수행 할 수 있습니다.하지만 내가하려는 것은 전달 된 클래스의 구체적인 클래스를 추상 클래스 대신 ServiceManager의 생성자에 가져 오는 것입니다. –
내가 아는 유일한 해결책은 2 개의 getter 메소드를 생성하는 것입니다. 하나의 getter 만 있으면 초 추상 클래스를 반환해야하기 때문에 2 가지 유형 각각에 하나씩 있습니다. AbstractService getService(); – sergiomse