2012-04-22 5 views
1

私のアプリには特別なフローがありますので、いつでも断片をメモリに保存しておく必要があります(メモリが逼迫している場合はOKですその断片が解放されることになる)。Androidで断片フローを完全に管理する

これまでのところ、現在のフラグメントの置換に成功しましたが、以前のフラグメントが常に破棄されることがあるため、(たとえばアクションバーを使用して)元のフラグメントに戻すと、再作成され、それには時間がかかります。

私は断片代わりの活動を使用する理由は、などのアクションバー、同じコンテナ内の複数の断片を置く能力は、非柔軟な活動 - テントの使用、の素敵な使い方です...

私が "Back"スタックを使用しない理由は、フローが変わる可能性があるので、どのフラグメントからでもフラグメントに行きたいということです。

ここに私のコードの抜粋です:

Fragment fragment=... ; //get the fragment from cache or create if not available yet... 
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.mainActivity_fragmentContainer, fragment).commit(); 

私もViewPagerを使用しようとしましたが、私はスライド効果を持っている必要はありませんので、(あなたが他のフラグメントにスライドすることを可能にする)とするのでフラグメントの1つに既にviewPagerが含まれていると、障害になります。メインのviewPagerでスライディングエフェクトを無効にすると、もう一方のビューでは無効になります。

ところで、私はネイティブAPIではなくフラグメントにアンドロイドサポートライブラリを使用しています。

、私の質問は: 速度を最大化し、断片のために使用されてあまりにも多くのメモリを回避しながら、どのように私は、に行くためにフラグメントの完全な制御を達成することができますか?


EDIT: 今のところは、私は次の回避策を使用します。 をonDestroyViewために、私が作成したビューの親を取り、そこから作成されたビューを削除します。

onCreateViewの場合、すでに作成済みのビューが既に存在する場合は、それを返します。

しかし、私はそれが奇妙な問題を引き起こす可能性があるので、私はフラグメントの管理方法がわからないので、非常に危険なことだと思います。プラス、私はアンドロイドがメモリが少ないと判断した場合にはどうなるのか分からない - 未使用のフラグメント(良い)を破棄するか、メモリ不足の例外(悪い)を破棄しますか?

+0

どこがあなたの質問ですか?どのように我々は助けることができます?フラグメントが作成されるのは遅れですか?フラグメントが表示されるのに必要な基礎となるデータの作成を確認しましたか? – user387184

+0

更新された質問。ごめんなさい 。 –

答えて

0

「非常に危険です」というご意見に同意します。あなたのアプローチの結果は本当に明確ではないので、私はこれを使用することをお勧めしません。

は、より良いあなたの問題を理解し、あなたにいくつかの指標を与えるために:

  1. あなたが遅くなるために何を考えていますか?私は切片を「狂ったように」続けていますが、タブレットでも問題なく動作しますが、ローエンドの携帯電話ではそれほど時間がかかりますが、それでも受け入れられます。つまり、毎回どのような根本的なデータを事前準備する必要がありますか?(もう一度、1kのエントリを持ついくつかのリストフラグメントがあり、毎回準備ができていて、かなり高速です)

  2. どのようにexacltyフラグメントを置き換えますか?特に、あなたはあなたの目標を達成するための一つの方法はFragmentTransaction.showとFragmentTransaction.hideを使用することですgetFragmentManager().executePendingTransactions();

+0

1.スピードは主な問題ではありません。主な問題は柔軟性です。可能であれば、それを再作成せずに必要なフラグメントに移動します。 2.いくつかのフラグメントは、内部でリフレッシュするのではなく再開し、ViewPagerを持つWebビューを持つ必要があります。 3.既にスニペットに記載されています。 –

+0

メモリについての質問は、フラグメントが特に強烈な記憶を必要としないので、実際には断片的な問題には見えません。それは一般的にもっと記憶の質問のようですか?右?次に、あなたは何をしたいのか、それになぜたくさんの記憶が必要だと思うのか、より具体的にする必要があります。あなたがそれらに参照を持つ必要がある "直接アクセス"で保持される機会を増やす方法では、より多くの参照、頻繁に彼らが高速アクセスストレージに保持される確率を高く要求する – user387184

+0

、私が尋ねた質問をお読みください。主な問題は柔軟性です。つまり、フラグメントを再作成せずにフラグメントに移動する方法と、アプリがあまりにも多くのメモリを必要とする場合にソリューションがフラグメントを解放するかどうかということです。 - メモリの例外はとても簡単です。 –

0

を呼んでください。 Fragment.isAddedを使用して、FragmentTranscation.addを最初に表示するか、呼び出すかを判断できます。欠点は、フラグメントが表示され、隠されているときに、一時停止/再開イベントを取得しないことです。 onHiddenChangedをオーバーライドする必要があります。また、バックナビゲーションをサポートしたい場合は、独自のスタックを管理する必要があります。

関連する問題