2

私は、Android プラットフォーム用の非常に小さなトリビア ゲームに取り組んでいるコンピューター愛好家です。

このゲームでは、複数のアクティビティ/ビュー ページ (エントリ、質問ページ、回答ページ、最終スコア ページ) 間でプレーヤーを移動します。1 つのトリビアの質問に関連するすべてのデータ (質問、4 つの答え、正解へのポインタ、プレーヤーの推測に応答するときにコンピューターが作成する関連コメント) を含む質問オブジェクトを作成し、ArrayList を正常に設定しました。 XML ファイルから DOM 解析したデータを含む Question オブジェクト。

ゲームの進行に伴い、アクティビティ間でこのデータをやり取りするための許容可能な方法は何ですか? ユーザーがゲーム内を移動するときに、これらのデータ オブジェクトを維持するにはどうすればよいですか?

グローバル変数はあまり推奨されないことを理解しています。また、Singleton デザイン パターンには、グローバル変数に関連すると言われている多くの問題があることもわかりました。これらのアプローチに代わるものを見つけることになると、私は困惑します。

MVC アプローチの基本を理解しています。私のアクティビティ *.java ファイルはコントローラー ファイルであり、XML で作成したレイアウト (ビュー) にリンクされています。ゲームの進行に合わせて維持および変更する必要がある 2 つの「モデル」オブジェクトがあります。(1) 上記の問題バンク ArrayList と、(2) プレイヤーの進行状況に関連するすべてのデータを含むある種の「PlayerProgress」オブジェクトです。ゲーム。

これらのデータ オブジェクトは、ゲームの開始時に最初にインスタンス化されますが、ユーザーがアクティビティ間を移動するときにそれらを維持する方法がわかりません。アクティビティ間で EXTRAS として情報を渡すことができることは知っていますが、EXTRA はこの目的を意図していないようです。たとえ EXTRAS がプレーヤーの進行状況プロパティに対して機能したとしても、アクティビティ間で 25 ~ 50 個の質問オブジェクトの ArrayList を渡すためにそれらを使用できるとは思いません。

シリアライゼーションとパーセル可能を調べましたが、ユーザーが異なるアクティビティ/ビュー間を行き来するたびに、データ モデル オブジェクトを基本的に分解してから再構成するのは奇妙に思えます (そしておそらく非効率的です)。これらのいずれかがこれを達成するための受け入れ可能な/一般的な方法である場合、私は喜んで先に進むことができますが、最初に他の人に確認したかった.

私はさまざまなプログラミング言語でこれに頭を悩ませ続けており、理解に失敗している全体像のより大きな部分があるのではないかと疑っています。オブジェクトとアプリケーションのライフ サイクルの説明をさまざまなリソースで読みましたが、この基本的な質問に対する解決策をまだ見つけられていません。

私は愚かなトリビア ゲームのコンテキストでこの質問をしています (「ゲームの進行に応じてアクティビティ間でデータ オブジェクトをやり取りするための許容可能な方法は何ですか」)。写真。一見基本的なことを説明する時間がない場合は、役立つと思われる他の本の説明を教えてもらえますか? (私の Safari の本棚にはいくつかのスロットが開いており、ほぼすべての技術出版物のコピーを追跡できます。)

ありがとう。

4

4 に答える 4

2

静的変数に関する 323go の投稿に直接回答するのに十分な投票がありませんが、その実装はまさに Singletonです。これを指摘したかったのは、あなたが質問で、Singleton 設計パターンがグローバル変数に関連すると言われている多くの問題を引き起こすことも知ったと述べたからです

関数やパラメーターをインラインで呼び出すことに慣れている場合、エクストラは最初はかなり奇妙だと思いますが、Android では通常の方法のようです。モデルオブジェクトがそれほど複雑でない場合、ほとんど透過的であるため、エクストラを使用する際に何が問題なのかわかりません。つまり、「Serializable」インターフェースを実装するだけで済みます。Serializable (リストとして) では「単独では」動作しないデータ型がいくつかあり、Parcelable を実装する必要がありますが、挿入された配列を宣言できます。Parcelable は「はるかに効率的」であるように思われるため、パフォーマンスを向上させたい場合は、誰かがここで言ったように、とにかく Parcelable を実装する必要があります: Android: Parcelable と Serializable の違い?

共有設定は、「引数を渡すツール」として使用することを意図しているとは思いません。物理メモリに読み書きする必要があるため、効率的ではないためです。これは、どのコンピューターシステムでも「難しい仕事」でした。 ; exrasはメモリスタックを介して送信されます(免責事項:テストはしていませんが、ロジックが教えてくれることです)。私は、ユーザー設定、インターネットで取得されたほとんど更新されていないデータ、スコアリング、セーブゲームなど、時間のかかる問題に対して dannyroa の方法 (json オブジェクトの保存) を使用しています。

そして最後に...コードを再構築できるかもしれません。質問ごとに新しいアクティビティを開いていますか? おそらく、1 つのアクティビティのみを使用して、フラグメントを使用できます。次に、アクティビティにグローバル変数を含めることができ、内部のフラグメントはgetActivity()でそこにアクセスできます。

((MyActivity)getActivity()).myGlobalVariable();
于 2013-07-18T19:37:51.063 に答える
0

私が試したのは、それらを SharedPreferences に保存することです。

オブジェクトを保存するには、Gson ライブラリを使用してそれを JSON 文字列に変換し、JSON 文字列をオブジェクトに変換します。

ただし、これは Serializable オブジェクトに対してのみ機能し、SharedPreferences からの読み取りと書き込みにオーバーヘッドがあることを意味します。

理想的なソリューションは、グローバルな static と SharedPreferences の組み合わせです。static 変数が null の場合は、SharedPreferences から取得します。SharedPreferences の値が更新されたら、必ず静的変数をクリアしてください。

static String userInfo = null;
public static String getUserInfo() {
    if (userInfo != null) {
        return userInfo;
    }
    return _getStringFromPref("userInfo");
}

public static String setUserInfo(String val) {
    _putStringToPref("userInfo", val);
    userInfo = val; //or you can just set userInfo to null;
}

SharedPreferences の代わりにローカル データベース (sqlite) を使用することもできます。

于 2013-07-15T18:22:57.360 に答える