1

Java環境でのソフト参照と弱参照については気がかりです。両方のトピックについても少し読みました。要約すると、弱参照は、その名前が示すように、オブジェクトへの弱参照です。これは、このオブジェクトへの参照がによって簡単に収集されることを意味しますGC。弱参照は次のように作成されます。

WeakReference<SomeOtherRef> weakReference = new WeakReference(someOtherRef); 

一方、ソフト参照は弱参照よりもはるかに長く存続します。だから私の質問は:

私のアプリケーションには、ListViewこのクラスのカスタムアダプターがあり、ListViewクリックなどの処理など、すべての基本的なものを処理します。ユーザーがリスト内の項目をクリックすると、AsyncTaskが開始されます。

convertView.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                LoadCase loadCase = new LoadCase(position, holder);
                loadCase.execute("");

            }
        });

今のところ、1つの理由でprogressDialogを表示しません。contextオブジェクト。私の問題はActivity、CustomAdapterを初期化するが多くのオブジェクトを保持していることです。Activity Context表示するには、への参照を渡す必要がありますProgressDialog。これにより、メモリリーク発生します。はい、試しました。これに対処するために弱/ソフト参照を適用するのは安全ですか?AWeakReferenceは、いつかnullになる可能性があります。これにより、NullPointerExceptionを初期化しようとしたときにが発生しますProgressDialog

4

1 に答える 1

1

はい、WeakReferenceアクティビティが破壊される可能性があるため、ここを使用することをお勧めします。を回避するために使用するたびに、nullかどうかを確認する必要がありますNullPointerException。nullの場合は、アクティビティが破棄されたことを意味します。したがって、通常、を表示しても意味がありませんProgressDialog

もちろん、アクティビティは破棄されて再作成される可能性があります(たとえば、向きの変更のため)。AsyncTask時間がかかる場合は、プログレスバーが表示されなくなるという問題が発生する可能性があります。しかし、ここでの問題はAsyncTask、長いタスクにを使用することであり、それらは短いタスクを対象としています。

AsyncTaskまた、クラスの内部クラスとしてサブクラス化する場合Activity、アクティビティへの強い参照があるため、aを使用しても意味がないことに注意してWeakReferenceください。

于 2012-12-10T08:51:26.040 に答える