0

WeakReference私は自分の Android プロジェクトで使用しようとしてきましたが、成功したことはありません。今、私は古いデバイスを扱っており、メモリをできる限りクリーンに保つ必要があるため、本当に必要です。

とにかく、さまざまな文字列のリストが約1000個ある配列があります。それをロードしてから、その中の文字列を見つける必要があります。

これは私が現在それを使用している方法です:

String[] campaignList = context.getResources().getStringArray(R.array.campaignList);
WeakReference<String[]> weakCampaignList = new WeakReference<String[]>(campaignList);

これは正しい使用方法WeakReferenceですか?はいの場合、私が理解できないのは、配列が で水和されString[]、それを に渡すことWeakReferenceです。これは、1 つの配列に割り当てられたメモリに 2 つのスポットがあることを意味しませんか? それとも私はWeakReference概念を完全に誤解していますか?

すべてのリソースの中で見つけた非常に優れたリソースは次のとおりです。

http://neverfear.org/blog/view/150/Strong_Soft_Weak_and_Phantom_References_Java

編集:

私のコードは問題なく動作します。パフォーマンスの点で正しいことをしているかどうかを知る必要があります。

for (int i = 0; i < weakCampaignList.get().length; i++) {
  Log.d(TAG,"weakCampaignList: "+weakCampaignList.get()[i]);
}

私のメソッド全体

public static String getTheCampaign(String country, Context context) {
        String campaign = "";
        campaign = "annual_subscription_" + country;

        String[] campaignList = context.getResources().getStringArray(
                R.array.campaign_list);

        ArrayList<WeakReference<String>> weakCampaignList = new ArrayList<WeakReference<String>>();
        for (String s : campaignList) {
            weakCampaignList.add(new WeakReference<String>(s));
        }

        if (country.equals("") || country.isEmpty()) {
            campaign = "annual_subscription_us";
        } else {
            for (int i = 0; i < weakCampaignList.size(); i++) {
                if (weakCampaignList.get(i).get().contains(campaign)) {
                    campaign = weakCampaignList.get(i).get();
                    return campaign;
                } 
            }
        }
        return campaign;
    }
4

3 に答える 3

0

これについては、正しい動作の要件という観点から考える必要があります。特に、個々の文字列がガベージ コレクションされていて、それを見つけようとするとどうなるでしょうか。

これを使用する場合は、ストレス テストによってテストする必要があります。弱い参照がガベージ コレクションされていることを確認してください。実際に動かしてみるまでは、正しく機能しているかどうかはわかりません。

リスト内の個々のエントリをリロードする方法がない場合は、おそらくリスト全体への単一の WeakReference が必要です。次に、アクセスする必要があるときはいつでも、GC されているかどうかを確認し、GC されている場合はリロードする必要があります。

あなたが書いた:

if (weakCampaignList.get(i).get().contains(campaign)) {
                campaign = weakCampaignList.get(i).get();

参照の get() が null でないことを確認するたびに、結果を変数に保存し、その後で使用します。参照がまだそこにあると仮定して、2 番目の get() を実行しないでください。ブルームーンに一度、そうではありません-その間、ガベージコレクターがそれを拾いました。参照内容を含む変数を保持している場合、それは起こりません。

WeakReferences を理解しているという確信が得られるまでは、プロダクション コードで WeakReferences を使用しません。

于 2013-06-07T02:48:46.197 に答える
0

これを試して

String[] campaing_list ....

        ArrayList<WeakReference<String>> list = new ArrayList<WeakReference<String>>();
        for (String s : campaing_list) {
            list.add(new WeakReference<String>(s));
        }
于 2013-06-07T00:40:50.127 に答える