質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

271閲覧

android : バックグラウンドサービスクラス上のArrayListオブジェクトからリサイクラービューにデータを表示するにはどうしたらよいか

firstlast

総合スコア138

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2022/06/14 04:16

質問内容

android : バックグラウンドサービスクラス(android.app.Serviceを継承)上のArrayList型変数に格納されているデータをリサイクラービューに表示するにはどうしたらよいでしょうか?
宜しくお願い致します。

関連URL
https://developer.android.com/reference/android/app/Service#WhatIsAService

実装イメージ

サービス

kotlin

1class SocketService : Service() { 2 3 lateinit var chatTextList: ArrayList<ChatText> 4 5 init { 6 chatTextList = ArrayList() 7 } 8 9 override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 10 ... 11 chatTextList.add(ChatText("text", "name", "111.111.111.111", Timestamp(System.currentTimeMillis()))) 12 ... 13 } 14 15 override fun onBind(intent: Intent?): IBinder? { 16 ... 17 } 18 19 override fun onUnbind(intent: Intent?): Boolean { 20 ... 21 } 22 23 override fun onRebind(intent: Intent?) { 24 ... 25 } 26 27 override fun onDestroy() { 28 ... 29 } 30 31 override fun onTaskRemoved(rootIntent: Intent?) { 32 super.onTaskRemoved(rootIntent) 33 stopSelf() 34 } 35 36 public fun connectP2pNetwork(address: String, name:String, status: String, memberCountText:String){ 37 } 38 public fun send(message: String) { 39 } 40 41} 42
サービス呼び出しと、リサイクラービューにArrayListをバインドしている部分(MainActivity)

kotlin

1 override fun onCreate(savedInstanceState: Bundle?) { 2 3 super.onCreate(savedInstanceState) 4 5 val adapter = ChatTextAdapter(chatTextList) ←ココ 参照の仕方が分かりません。 6 binding.chatRecyclerView.layoutManager = LinearLayoutManager(this) 7 binding.chatRecyclerView.adapter = adapter 8 9 10 val intent = Intent(this@MainActivity, SocketService::class.java) 11 if (Build.VERSION.SDK_INT >= 26) { 12 startForegroundService(intent) 13 } else { // Debug.print("SDK_INT < 26") 14 startService(intent) 15 } 16 17 } 18 19以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

サービスに bind してデータを貰うのは如何でしょうか。

投稿2022/06/14 05:00

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

firstlast

2022/06/14 07:44 編集

回答ありがとうございます。 サービスにパブリックメソッドを実装して、画面からそのメソッドを呼び出してデータを取得するということですね。サービスが保持しているデータと同じデータをできるだけ早く画面に反映したいので、サービスのデータが追加されたときに、サービスからローカルブロードキャストを送信して、画面側にブロードキャストレシーバーを用意して受信すればできますね。 質問文には書いていなかったのですが、サービスのデータ(ArrayList型のオブジェクト)は、結構頻繁に要素が増えることを想定していました。まぁ、差分だけのコピーなのでそれほど負荷のかかるような処理でもなさそうです。 これで行ってみようと思います。 毎度、ありがとうございます。m(_ _)m
firstlast

2022/06/14 07:42

補足: 上記で言及しているローカルブロードキャストは、あくまでもサービスのデータに変化があったことを画面に通知する目的で使用します。 画面がスリープしていたり、別の画面に遷移している状態では、画面はデータを受け取れないので、サービスがローカルブロードキャストを使ってデータを送信することはしません。一応念のため補足します。
jimbe

2022/06/14 10:07

bind してしまえば、ブロードキャストは必要無いのではないでしょうか。 bind によって「データを追加受信したら通知を受ける用のリスナ」を登録するようにすれば、そのリスナが実行された時に追加データ(最後に取得した時間をパラメータにしてその時刻以降のデータ)を得る方法があると思います。 また、 bind して Service から ViewModel の List (LiveData) にデータを追加するようにし、 LiveData からのイベントで RecyclerView のアダプタの更新を行う方法も考えられます。
firstlast

2022/06/14 11:28

いろいろと解決策を教えて頂きありがとうございます。 サービスをbindすると、メソッドだけでなく、リスナも実行できるようになるんですね。わざわざ、ローカルブロードキャストを使う必要がなくなりました。やっぱり、人に聞いてみるもんですね。助かりました。 m(_ _)m ライブデータは、ちょっと頭が混乱しそうなので、もう少し上達してから手を出そうと思います。
jimbe

2022/06/14 13:37

手元にソレらで動作しているコードがあるわけではありませんので、どこか抜けているかもしれないことは予めご了承ください (_ _;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問