【質問】サービスに対して複数のbindし、コールバックメソッドを登録する。

477 views
Skip to first unread message

正岡隆

unread,
Aug 28, 2013, 7:21:22 AM8/28/13
to android-g...@googlegroups.com
お世話になっております。

現在、一つのサービス対して、複数フラグメントからbindし、且つコールバック登録をしております。
そして、フラグメント毎に独自の処理をサービスにさせ、その結果を呼び出し元に返却するという処理を行っておりますが、
挙動が安定しません。具体的には下記となります。

【問題の現象】
※フラグメントA・フラグメントBとします。

①フラグメントA・フラグメントB起動。

②フラグメントA・フラグメントB起動時、サービスにバインド。(バインド時、aidlを使用してフラグメントからフラグメント毎の値を渡しております。)

③サービスはバインドされると、各フラグメントのI/Fをコールバック登録し、且つ値もArrayListに格納。(コールバックリストの要素数とArrayListの要素数は一致するはず)

④サービスは定期処理を行い、コールバックリスト、ArrayListを元に妥当な値を返却する。

⑤フラグメントA・フラグメントBを確認するとフラグメントAに戻ってくるべき値がフラグメントBに戻ったり、フラグメントBに戻ってくるべき値がフラグメントAに戻ったりする。


色々、試しましたが理由が分からず登録させて頂きました。
ご教授のほど宜しくお願い致します。


【ソース】

public class MySettingService extends Service {

//Test Start
private int iRegisterCnt = 0;
private int iBindCnt = 0;
//Test End

final static String TAG = "MySettingService";

//ForeGround ID
private static final int FOREGROUND_ID = 1;

//Thread-related variable
private ScheduledExecutorService scheduler;
private Handler mHandler = new Handler();

//Timer settings
private static final int TIMER_VALUE = 100;

private ArrayList<String> arryVGetMesData = new ArrayList<String>(); 

private final RemoteCallbackList<IMySettingCallBack> callbackList
= new RemoteCallbackList<IMySettingCallBack>();

private IMySettingService.Stub MysettingserviceIF = new IMySettingService.Stub(){

@Override
public void registerCallback(IMySettingCallBack callback, String vgetdata)
throws RemoteException {
callbackList.register(callback);
setVGetMes(vgetdata);
//Test Start
iRegisterCnt++;
Log.e(TAG, "call registerCallback !!! vgetdata = " + vgetdata + " RegisterCnt = " + iRegisterCnt);
//Test End
}

@Override
public boolean unregisterCallback(IMySettingCallBack callback, int arrayno)
throws RemoteException {
Log.d(TAG, "call unregister !!!");
removeVGetMes(arrayno);
boolean bret = callbackList.unregister(callback);
return bret;
}

};

@Override
public IBinder onBind(Intent intent) {
if(IMySettingService.class.getName().equals(intent.getAction())){
//Test Start
iBindCnt++; 
Log.e(TAG, "rev intent MysettingserviceIF = " + MysettingserviceIF + " iBindCnt = " + iBindCnt);
//Test End
return MysettingserviceIF;
}
return null;
}

@Override
public void onCreate() { //onCreate
super.onCreate();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
mHandler = new Handler();
startForeground(FOREGROUND_ID,new Notification());
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new MySettingServiceTimer(this), 0, TIMER_VALUE, TimeUnit.MILLISECONDS);
Log.d(TAG, "onCreate");
} //onCreate

@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
scheduler.shutdown();
}

/*****************************************************************/
/* Note.Private Method area.
/*****************************************************************/
private void setVGetMes(String mesdata){
arryVGetMesData.add(mesdata);
}

private ArrayList<String> getVGetMes(){
return arryVGetMesData;
}

private void removeVGetMes(int arrayno){
arryVGetMesData.remove(arrayno);
}

/*****************************************************************/
/* Note.Provide external method area.
/*****************************************************************/
public class MySettingServiceTimer implements Runnable{ //MySettingServiceTimer

final static String TAG = "MySettingServiceTimer";

//Class instance variables
private DataAccessInterface mdai = null;

MySettingServiceTimer(Context context){ //MySettingServiceTimer()
mdai = new DataAccessInterface(context);
} //MySettingServiceTimer()

@Override
public void run() { //run()

mHandler.post(new Runnable(){ //mHandler

@Override
public void run() { //run()

int iNum = callbackList.beginBroadcast();
//Test Start
//Log.e(TAG,"iNum = " + iNum);
//Test End
for(int i = 0; i < iNum; i++){ //for
try{
Log.e(TAG, "getVGetMes().get(i) = " + getVGetMes().get(i));
String[] strReq = mdai.readValueRequest(getVGetMes().get(i));
Log.e(TAG, "strReq[] = " + strReq[1]);
if(strReq[0].equals(DataAccessConstants.DACC_RESULT_OK)) {
Log.d(TAG, "Call onVgetDataResponse !!!");
callbackList.getBroadcastItem(i).onVgetDataResponse(strReq[1],i);
Log.e(TAG, "Return onVgetDataResponse !!! strReq[1] = " + strReq[1]);
}else{
Log.e(TAG, "Communication error!!!");
}
}catch(RemoteException e){
Log.e(TAG, "RemoteException Error!!!");
}
} //for

callbackList.finishBroadcast();

} //run()

}); //mHandler

} //run()

} //MySettingServiceTimer


}

Reply all
Reply to author
Forward
0 new messages