Обратный вызов встроенного связывателя зависаетAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Обратный вызов встроенного связывателя зависает

Сообщение Anonymous »

Я работаю над базой кода AOSP с помощью NXP EVK. У меня есть интерфейс связывателя, который получает обратный вызов. Существует два типа клиентов, которые могут подключаться к услуге. Один клиент производит данные, а другой является потребителем данных. Потребитель получает данные через IMyServiceListener, а производитель получает уведомление о новом клиентском соединении через IMyClientListener. В моей реализации функции подключения службы я пытаюсь вызвать обратный вызов производителя (onNewClient), но он зависает и никогда не возвращается. Производитель и потребитель работают в разных процессах. Потребитель имеет аналогичную реализацию, что и производитель, он просто подписывается на обратный вызов IMyClientListener вместо IMyServiceListener.
Сценарий:
  • Запуск службы
  • Производитель запускается
  • Производитель вызывает соединение
  • Производитель подписывается на IMyClientListener
  • Производитель ожидает обратного вызова
  • Потребитель запускается
  • Потребительский вызов подключается
  • В службе Connect, служба вызывает обратный вызов для IMyClientListener и зависает навсегда.
Я попробовал шаг 8 с использованием потоков, но поток все равно зависает навсегда.// AIDL interfaces

interface IMyServiceListener {
boolean onData(in byte[] data);
}

interface IMyClientListener {
boolean onNewClient();
}

interface IMyService {
boolean connect();
boolean subscribeToClientListener(IMyClientListener listener);
boolean subscribeToListener(IMyServiceListener listener);
}

//////////Service code using platform c++ binder

class CMyService : public BnMyService
{
sp mClientListener = nullptr;
sp mListener = nullptr;
public:

static void instantiate() {
defaultServiceManager()->addService(
String16("com.my.service"), new CMyService());
}

binder::Status connect(bool* _aidl_return)
{

//blah blah other code to connect

if (mClientListener != nullptr)
{
mClientListener->onNewClient();
// Above code hangs
}
}

binder::Status subscribeToClientListener(const sp& listener, bool* _aidl_return)
{
mClientListener = listener;
*_aidl_return = true;
}

binder::Status subscribeToListener(const sp& listener, bool* _aidl_return)
{
mListener = listener;
*_aidl_return = true;
}

}

/////////Producer code using NDK binder

struct CClientListenerData
{
void* mUserData = nullptr;
};

class CMyClientListener : public aidl::com::my::BpMyClientListener
{
private:
CClientListenerData* mListener = nullptr;
public:
explicit CMyClientListener(const ::ndk::SpAIBinder& binder, CClientListenerData* listener) : BpMyClientListener(binder) {mListener = listener;}
virtual ~CMyClientListener() = default;
virtual ::ndk::ScopedAStatus onNewClient(bool* _aidl_return) override;
};

::ndk::ScopedAStatus CMyClientListener::onNewClient(bool* _aidl_return)
{
// Got the callback

return ndk::ScopedAStatus::ok();
}

class CMyProducer
{
private:
std::shared_ptr mMyServiceInterface;
std::shared_ptr mMyClientListener;
::ndk::SpAIBinder mNewBinder = ::ndk::SpAIBinder(CreateBinder::NewBinder());
CClientListenerData mListener;
CMyClientListener mCMyClientListener = CMyClientListener(mNewBinder, &mListener);
public:

CMyProducer()
{
mMyClientListener = std::shared_ptr(&mCMyClientListener);
}

bool Connect() {
::ndk::SpAIBinder binder(AServiceManager_getService("com.my.service"));
mMyServiceInterface = aidl::com::my::IMyService::fromBinder(binder);
bool ret = false;
mMyServiceInterface->connect(&ret);
return ret;
}

bool SubscribeToClient(bool* _aidl_return))
{
mMyServiceInterface->subscribeToClientListener(mMyClientListener, &ret);
}

};


Подробнее здесь: https://stackoverflow.com/questions/756 ... is-hanging
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»