Привязка к сервису, который реализует интерфейс - PullRequest
1 голос
/ 27 июля 2011

РЕДАКТИРОВАТЬ: код ниже был отредактирован, чтобы показать правильное решение проблемы.

У меня есть приложение, которое использует службу переднего плана для выполнения сетевых операций.

В настоящее время служба переднего плана использует соединение Bluetooth для выполнения операций.Я пытаюсь внедрить новую версию сервиса, которая вместо этого использует Wi-Fi, и позволяет пользователю решать, использовать ли Bluetooth или Wi-Fi через общие настройки.

Я реализовал сервис Wi-Fi, и теперь янужно привязать к нему.Я создал интерфейс MyService, который определяет все методы, которые требуются обеим версиям сервиса.Однако, когда я пытаюсь привязать сервис к своей деятельности, я получаю ошибку ClassCastException.

Вот соответствующие части моего интерфейса сервиса:

MyService.java:

public interface MyService {
// constants

...

// method declarations
...

public interface LocalBinder {
        MyService getService(Handler handler);
    }
}

А вот соответствующие методы, которые присутствуют в обеих версиях сервиса:

MyBluetoothService.java:

public class MyBluetoothService extends Service implements MyService {

private final IBinder mBinder = new LocalBinder();

...

public class LocalBinder extends Binder implements MyService.LocalBinder {
    MyService getService(Handler handler) {
        mHandler = handler;

        // Return this instance of MyService so clients can call public methods
        return MyBluetoothService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    Log.w(TAG, "MyBluetoothService bound");

    return mBinder;
}
}

MyWifiService.java: Точно так же, как MyBluetoothService.javaза исключением того, что имена классов меняются по мере необходимости.

И вот где я связываюсь со службой в своей деятельности:

MyService mChatService = null;
...

private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName className,
            IBinder service) {
        // We've bound to MyService, cast the IBinder and get MyService instance
        LocalBinder binder = (LocalBinder)service;  <------- ClassCastException
        mChatService = binder.getService(mHandler);
        mBound = true;
    }

    @Override
    public void onServiceDisconnected(ComponentName argo) {
        mBound = false;         
    }
};

ClassCastException происходит в строке, указанной выше.

Теперь, когда все это за пределами пути ... возможно ли привязать к сервису таким образом?Кроме того, я всегда мог проверять общие предпочтения каждый раз, когда вызываю метод из службы, но я бы предпочел этого не делать.

1 Ответ

0 голосов
/ 28 июля 2011

Я предполагаю, что код, который он генерирует, является классом MyService.LocalBinder, а не классом MyBluetoothService.LocalBinder?

Я думаю, что вы хотели сделать, это определить класс MyBluetoothService.LocalBinder для расширения из класса MyService.LocalBinder?

, например

public class MyBluetoothService extends Service implements MyService {

private final IBinder mBinder = new LocalBinder();

...

public class LocalBinder extends MyService.LocalBinder {
    MyService getService(Handler handler) {
        mHandler = handler;

        // Return this instance of MyService so clients can call public methods
        return MyBluetoothService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    Log.w(TAG, "MyBluetoothService bound");

    return mBinder;
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...