サービスからのコールバック

1,824 views
Skip to first unread message

iwata naoki

unread,
Oct 12, 2010, 2:59:48 AM10/12/10
to 日本Androidの会
岩田と申します。

現在サービスからのコールバックを実装しています。
AIDLを利用し実装することはできたのですが、beginBroadcast()メソッドでエラーが発生する場合があります。
が発生し、エラーで終了してしまいます。
おそらくコールバックの処理が終了する前に次のコールバックが発生してbeginBroadcast()でエラーが出たのだと考えています。
なので、対策案としてフラグをメンバ変数で定義し、コールバック処理中はフラグをオンにしておき、次に来たコールバックはループで一時停止するようにし
ました。
結果エラーは発生しなくなりました。

そこで本題なのですが、本当にこの対策案は正しいのでしょうか?
beginBroadcast()のリファレンスを読んだところハンドラを使用するか、自前で同期しろとの事だったのですが、
この対策は後者にあたるのでしょうか?

対策案の擬似コードは以下です。

private boolean mStatFlag = false;

private HogeCallback mHogeCallback = new HogeCallback() {

public void onStatChange() {

// 先にonStatChangeが実行されている場合はループして待つ
//while(mStatFlag){};

// あとから実行されたonStatChangeを止めるためのフラグをオンにする
mStatFlag = true;

int n = mHogeCallback.beginBroadcast();

// すべてのリスナーにコールバック
for (int i = 0; i < n; i++) {
try {
mHogeCallback.getBroadcastItem(i).onStatChange();
} catch (RemoteException e) {
}
}
// ブロードキャストの終了
mOnStatChangeListener.finishBroadcast();

// 次のonStatChangeを実行できるようにフラグをオフにする
mStatFlag = false;
}
};

以上です。

Tomoki Iwai

unread,
Oct 13, 2010, 8:25:30 AM10/13/10
to 日本Androidの会
岩井です。

コールバック処理が終了する前に次のコールバック処理が発生するということは
サービス内でスレッドを利用し、そのスレッド上でbeginBroadcast()をコールしているのでしょうか。

であれば、RemoteCallbackListインスタンスのロックを取得することで実現するのが妥当かと思います。


■サービスの実装がこんな感じの場合

class HogeService extends Service
{
private final RemoteCallbackList<IMyServiceCallback> callbackList
= new RemoteCallbackList<IMyServiceCallback>();

private IMyService.Stub service = new IMyService.Stub()
{
public void unregisterCallback(IMyServiceCallback callback)
throws RemoteException
{
callbackList.unregister(callback);
}

public void registerCallback(IMyServiceCallback callback)
throws RemoteException
{
callbackList.register(callback);
}
}

...
}


■同期処理は、callbackListをロックすることで実現

synchronized (callbackList)
{
int n = callbackList.beginBroadcast();


callbackList.getBroadcastItem(i).echo(Thread.currentThread().getName());

callbackList.finishBroadcast();
}

以上、参考になれば幸いです。

iwata naoki

unread,
Oct 14, 2010, 3:12:24 AM10/14/10
to 日本Androidの会
岩田です。

岩井さんありがとうございます。
大変参考になります。
試せていませんが試してみたいと思います。

以上です。
Reply all
Reply to author
Forward
0 new messages