2016-04-05 7 views
1

私はアンドロイドに慣れていて、自分のクラスの一つで良いデザインパターンを学んでいます。私は私のプロジェクトの一環としてアプリケーションを開発していますが、私はいくつかの設計上の問題にぶつかり、何が良いパターンであるかを把握しようとしています。アクティビティ間でオブジェクトやオブジェクトのリストを渡す効率的な方法は何ですか?

私はすべて作成したプレイリスト、利用可能なすべての曲の のArrayListのArrayListのを持っていますアプリを通じて、以下のクラス

public class Playlist { 
    ArrayList<Song> songs = new ArrayList<Song>(); 
    //..getters and setters and song to list 

    } 

public class Song { 
    private String name; 
    private String artist; 
    private String File; 
    //Getters and setters 

} 

を持っています。

最終的に、アプリケーションはJSONオブジェクトをダウンロードし、そのオブジェクトのSongクラスのインスタンスを作成します。私は、プレイリストオブジェクトのリストを維持するための方法に探していると、曲のリストには、すべての活動を通して利用可能なオブジェクトと、私は次の解決策を発見した

  1. はGsonを作り、sharedPrefに保存しますファイル(これは良いアイデアのように私は絶えず保存して書くことはないようです)。しかし、ほとんどの曲をJSONオブジェクトとして取得し、そのオブジェクトで曲のインスタンスを作成するので、私はそれの要点を見ていません。

  2. 私はリストをインテントで渡すことができるように細心の注意を払ってプレイリストを実装しましたが、変更があるたびに共有プリセットを更新する必要があるため、これは最善の方法とは思われません。

誰かが正しい方向に向いているか、リストのシングルトンを作るのが最も効率的な方法のように見えるのですか。活動の間でオブジェクトを渡すには

おかげ

+0

また、さまざまな画面に対してアクティビティではなくフラグメントを実装することもできます。その後、データを管理するために、フラグメントからのアクティビティにコールバックを実装することができます。 – dharms

答えて

0
  • SQLiteのはできるだけ早くあなたが店に起動間でデータを必要として正しいアプローチだろうが、あなたのアプリがアクティブなときにだけデータを保持したい場合にはunfittingです。
  • グローバルシングルトンを使用できます。これは確かに最も簡単な解決策です。
  • 代替方法はイベントバスシステムであるかもしれません。それぞれのコンポーネントはデータのコピーを保存します。 1つのコンポーネントがデータの更新を担当します。更新が利用可能な場合、Eventbusを介して他のすべてのコンポーネントに通知します。これはおそらくを考慮しての最も良いソリューションです。
+0

私はちょうどユーザーが最終的に(JSONオブジェクト内の) "曲"をダウンロードするので、SQLiteのアプローチが少し冗長になるかどうか疑問に思っています。これはダウンロードオブジェクトになります - >曲のインスタンスにする - >歌のArraylist - >それをSQLiteに追加します。これは良いアプローチですか?ありがとう – Beto

+0

データを保存する必要がある場合は、忠実な表現を導入する必要があります。あなたのデータがリストの場合は、ほとんどの場合データベースが正しい選択です。あなたの使用状況に応じて、ダウンロード→sqlite→pojoの方が良いアイデアかもしれませんが、一般にあなたが言ったことは良いことです。 – F43nd1r

+1

興味深い。あなたが言及した方法について何か不思議。アプリサイクル中にアプリが破棄されると、アプリが再び開いたときにオブジェクトが破棄され、データベースにクエリを出して新しいオブジェクトを作成できるようにすると、さらに有益でしょうか?すなわち、アプリケーションの起動、作成、チェックdb、リストの作成、ビューへの提示 – Beto

0
  1. (グローバル・シングルトンはそうアンドロイドオブジェクトonDestroy()を破壊しないでしょう)、Parcelableは良いアイデアです。 my_object

Parcelableを実装するクラスのオブジェクト:

ちょうどあなたのクラスがparcelableにするためにこれを使用し、また

Intent intent = new Intent(ActivityA, ActivityB); 
intent.putExtra("MY_OBJECT", my_object); 
... 

を使用し、活動の間を通過するには、次の http://www.parcelabler.com/

  1. あなたの音楽リストを保存したい場合は、データベースsqliteを作成し、各オブジェクトをSqliteタブの行として保存します。次に、内部データベースにある曲の完全なリストを返すメソッドを実装できます。
0

効率的なものは何ですか?

あなたのユースケースでは、ユーザーがプレイリストを変更したときにかなり小さなオブジェクトのインスタンスをいくつか渡す必要があります。

  1. これはあまり起こりません。
  2. 転送されるインスタンスの数とサイズは、ほとんどの場合小さくなります。 (人々は何千もの曲のプレイリストを持っていますか?)
  3. ユーザーは変更に対する「即時の」応答を必要としません。

要するに、CPUを最も効率的に使用する必要があるという明白な理由はありません。 (少なくとも、それは私の意見です)。

他の効率は開発者の効率です。つまり、この特定の機能の設計、実装、テスト、チューニング、メンテナンスに費やす時間。


FWIW、私は、彼らはまた、プレイリストを永続化するために役立つであろうので、好みやSQLlite DBが良いだろうと思います。

関連する問題