onCreate()でサービスにバインドし、且つ、サービスから値を取得したいが出来ない。

274 views
Skip to first unread message

三宅義之

unread,
Dec 1, 2014, 7:44:18 PM12/1/14
to android-g...@googlegroups.com
いつもお世話になっております。
三宅です。

ActivityのonCreate()、fragmentのonCreateView()でサービスから値を取得したいのですが、
onCreate()には接続が完了しておらず、アクセスできません(調べるとそれが仕様ぽいですが)。
ServiceConnection()のインスタンスがセットされるまで待ってみるとかやってみたんですが駄目でした。。。

私としては下記、仕様を満たしたく思考錯誤しているのですが、何か良い方法はないでしょうか?
もしくはこういった仕様の実装をやったことがあり、アドバイスがあれば幸いです。


【仕様】
①起動管理アプリが起動(BOOT_COMPLEATEにて)
②起動管理アプリから設定値管理サービス起動。
③設定値管理サービスは起動後、初期値をイーサーネット経由で取得。且つその初期値をバッファにキャッシュする。
④ユーザーの手によって画面アプリ起動。
⑤画面アプリは画面生成時、設定値管理サービスから設定値を取得し、画面レイアウトを決め、画面を生成。

※上記仕様にしようとした訳:
⑤で設定値管理サービスから設置値を取得せず、画面アプリ自身でワンショットで取得しても良いのですが
設定値管理サービスで予め取得し、それを使用するほうが処理速度が早いと考え、設定値管理サービスを使用しております。
もし、画面アプリにてワンショットで取得する場合、Strict問題で取得処理を別スレッド化し、UIスレッドと別スレッドで待ち合わせを
行わなければならず、現在のプロジェクト開発形態に向いていないと考えた為。




Shigeo Mutoh

unread,
Dec 1, 2014, 11:20:13 PM12/1/14
to android-g...@googlegroups.com
武藤です。

On 2014/12/02 9:44, 三宅義之 wrote:
> ActivityのonCreate()、fragmentのonCreateView()でサービスから値を取得したいのですが、
> onCreate()には接続が完了しておらず、アクセスできません(調べるとそれが仕様ぽいですが)。
> ServiceConnection()のインスタンスがセットされるまで待ってみるとかやってみたんですが駄目でした。。。

bindServiceして、onServiceConnected以降にServiceへアクセスできなかった
ということですか? それは何かが間違っていると思います。
ActivityからServiceへアクセスする方法についてよく調査してみてください。

> ※上記仕様にしようとした訳:
> ⑤で設定値管理サービスから設置値を取得せず、画面アプリ自身でワンショットで取得しても良いのですが
> 設定値管理サービスで予め取得し、それを使用するほうが処理速度が早いと考え、設定値管理サービスを使用しております。
> もし、画面アプリにてワンショットで取得する場合、Strict問題で取得処理を別スレッド化し、UIスレッドと別スレッドで待ち合わせを
> 行わなければならず、現在のプロジェクト開発形態に向いていないと考えた為。

事情は詳しく分かりませんが、定期的にサーバからデータを引き取る必要があるなら
まだしも、ユーザーが画面を開いた時にだけ必要な初期値データなら、そのタイミング
でサーバにアクセスすべきだと思います。

あとServiceは絶対に生き続けるわけではないので、③で取得したデータをバッファ
に貯めておいて、という戦略は破綻します。

もう一度仕様から練り直した方が良いと思います。

では。


三宅義之

unread,
Dec 2, 2014, 7:56:26 PM12/2/14
to android-g...@googlegroups.com
武藤様、有難うございます。

>ActivityからServiceへアクセスする方法についてよく調査してみてください。 
下記でも事例があるようです。



>ユーザーが画面を開いた時にだけ必要な初期値データなら、そのタイミング 
>でサーバにアクセスすべきだと思います。 
サーバ側の値が変更された場合、サービスに通知し、常に最新データを取得するので
大丈夫だと思っているのですが。。。検討してみます。

>あとServiceは絶対に生き続けるわけではないので、�で取得したデータをバッファ 
>に貯めておいて、という戦略は破綻します。
バッファはあくまでもアクセス用であり、マスタはDBないし、ファイルに保持し、
バッファ内のデータが喪失した場合、マスタからリストアします。
検証したところ、DBアクセスからの値の取得より、キャッシュバッファからの取得の方が
平均的に早かったのでそのように致しております。
ご指摘の通り、いつサービスがキルされるか不明ですので、あらゆるパターンは検証いたします。

2014年12月2日火曜日 13時20分13秒 UTC+9 TM:

Shigeo Mutoh

unread,
Dec 2, 2014, 10:20:27 PM12/2/14
to android-g...@googlegroups.com
武藤です。

On 2014/12/03 9:56, 三宅義之 wrote:
>> ActivityからServiceへアクセスする方法についてよく調査してみてください。
> 下記でも事例があるようです。

それは事例ではなくて、こういうのはダメですとおっしゃってますね。

bindService(intent, conn, BIND_AUTO_CREATE);
service.serviceAPI(); // ここで落ちます

なので、ActivityからServiceへアクセスする場合に、処理のシーケンス
があるから知らないといけないです。

簡単に言えば、bindServiceしてからonServiceConnectedが呼ばれるまでの間は
まだ接続が完了してないからserviceのAPIは呼べないのです。


あと仕様のことですが、とやかく言う筋合いはまったくないので失礼だと
は思うのですが、もう少しだけお許しください。

仮にそのServiceがサーバからの初期値を何らかの原因で取得できなかった
ケース、取得中のケース、サーバに新しいデータがあるがまだ取得できて
いないケースで、ユーザが画面を開いた時、どう振る舞うかを想定していますか?

私はそれを考えるだけでも嫌になってしまいます。

では。

Reply all
Reply to author
Forward
0 new messages