

こんにちは

質問はタイトルの通り「AndroidでActivity/ArrayAdapterを疎結合にするためには？」です。  
ActivityとArrayAdapterがメソッドを相互に呼び合っている(循環参照)コードを書いてみました。

ActivityとArrayAdapterが循環参照の状態にあるのは、設計ミスなのかもしれません。  
しかし、アプリに1箇所や2箇所、循環参照になっているところがあるんじゃないかなって思います。

ちなみに、Android歴2～3日なので、Androidプログラミングよくわかってませんorz  
皆様方はAndroidで循環参照になった時に、どのようにプログラム書かれてますか？

ArrayAdapterをFragmentと、読み替えて頂いても結構です。


CC BY-SA 3.0
2015-03-10T08:39:02.030
7717
2019-06-29T09:04:38.547
2019-06-29T09:04:38.547
9008
8247
question
android java 循環参照
AndroidでActivity/ArrayAdapterを疎結合にするためには？


循環参照は普通に発生します。  
循環参照を完全に回避するためにはオブジェクト指向を捨てる必要があります。  
現環境においては、現実的ではありません。

一方、相互結合は理想的には避けるべきです。  
ただしこれも程度問題があります。先のActivity/ArrayAdapterの場合、がんばって疎結合にしてもあまり実りがありません。

逆にActivity/Fragmentは **疎結合を維持すべき** です。  
というより、そのためにActivityとFragmentが用意されています。

疎結合を達成する手法はいくつかあります。  
・Interface  
インターフェイスを手で書きます。

・DI Container  
依存性注入パターンです。  
AndroidですとDagger、AndroidAnnotationsあたりが有名です。

・Pub/Sub  
トピックに対して、発行者が発行すると、購読者に通知がいきます。  
EventBusが有名です。

TPOに合わせて柔軟に選択してください。


CC BY-SA 3.0
2015-04-10T13:03:27.903
9018
2015-04-10T13:18:31.067
2015-04-10T13:18:31.067
9191
9191
7717
answer


(回答の前提として、質問文章中の「循環参照」というのは、Activity内でAdapterのメソッドを呼び、また、Adapter内でActivityのメソッドを呼んでいることを指しているのだと理解しました。)

ArrayAdapter(の継承元クラスであるBaseAdapter)には、管理データ(すなわち表示対象)変更時に通知を受け取るリスナが登録できます。

[BaseAdapter#registerDataSetObserver(DataSetObserver)](http://developer.android.com/reference/android/widget/BaseAdapter.html#registerDataSetObserver\(android.database.DataSetObserver\))

現在のコードにおいて、Adapter内で実装してしまっている循環参照処理をDataSetObserver内に移すことで、問題があると感じている事象を修正できないでしょうか。

例えば、ボタンを押した時の処理を、[Button](http://developer.android.com/reference/android/widget/Button.html)クラスを継承してそこに実装することは稀で、通常はOnClickListenerに実装し、それをリスナとしてボタンに登録しますよね。  
ひとまずはそれと同じことだと考えると理解しやすいかと思います。

(※ 具体的なコードと、どの箇所が問題であると感じているのかという記述があれば、より具体的な回答を引き出せるかと思います。)


CC BY-SA 3.0
2015-07-10T03:40:35.403
12240
2015-07-10T04:13:26.150
2015-07-10T04:13:26.150
2808
2808
7717
answer