[EDIT2] Я нашел еще один хороший пример WeakReference
. Обработка растровых изображений вне потока пользовательского интерфейса страница в Эффективное отображение растровых изображений учебное руководство, показывает одно использование WeakReference
в AsyncTask.
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int data = 0;
public BitmapWorkerTask(ImageView imageView) {
// Use a WeakReference to ensure the ImageView can be garbage collected
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Decode image in background.
@Override
protected Bitmap doInBackground(Integer... params) {
data = params[0];
return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
}
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
В нем говорится,
Слабая ссылка на ImageView гарантирует, что AsyncTask не препятствует сборке мусора ImageView и всем, на что он ссылается .Нет гарантии, что ImageView все еще существует, когда задача завершается, поэтому вы также должны проверить ссылку в onPostExecute ().ImageView может больше не существовать, если, например, пользователь отходит от действия или если изменение конфигурации происходит до завершения задачи.
Счастливого кодирования!
[EDIT] Я нашел действительно хороший пример WeakReference
из facebook-android-sdk . ToolTipPopup Класс - это не что иное, как простой класс виджетов, который показывает всплывающую подсказку над видом привязки.Я сделал снимок экрана.

Класс действительно прост (около 200 строк) и заслуживает внимания.В этом классе класс WeakReference
используется для хранения ссылки на представление привязки, что имеет смысл, так как позволяет сборщику мусора собирать мусор, даже когда экземпляр всплывающей подсказки живет дольше, чем его представление привязки.
Удачного кодирования!:)
Позвольте мне поделиться одним рабочим примером класса WeakReference
.Это небольшой фрагмент кода из виджета фреймворка Android под названием AutoCompleteTextView
.
Вкратце, класс WeakReference
используется для хранения объекта View
, чтобы предотвратить утечку памяти в этом примере.
Я просто скопирую и вставлю класс PopupDataSetObserver, который является вложенным классом AutoCompleteTextView
.Это действительно просто, и комментарии хорошо объясняют класс.Удачного кодирования!:)
/**
* Static inner listener that keeps a WeakReference to the actual AutoCompleteTextView.
* <p>
* This way, if adapter has a longer life span than the View, we won't leak the View, instead
* we will just leak a small Observer with 1 field.
*/
private static class PopupDataSetObserver extends DataSetObserver {
private final WeakReference<AutoCompleteTextView> mViewReference;
private PopupDataSetObserver(AutoCompleteTextView view) {
mViewReference = new WeakReference<AutoCompleteTextView>(view);
}
@Override
public void onChanged() {
final AutoCompleteTextView textView = mViewReference.get();
if (textView != null && textView.mAdapter != null) {
// If the popup is not showing already, showing it will cause
// the list of data set observers attached to the adapter to
// change. We can't do it from here, because we are in the middle
// of iterating through the list of observers.
textView.post(updateRunnable);
}
}
private final Runnable updateRunnable = new Runnable() {
@Override
public void run() {
final AutoCompleteTextView textView = mViewReference.get();
if (textView == null) {
return;
}
final ListAdapter adapter = textView.mAdapter;
if (adapter == null) {
return;
}
textView.updateDropDownForFilter(adapter.getCount());
}
};
}
И PopupDataSetObserver
используется при настройке адаптера.
public <T extends ListAdapter & Filterable> void setAdapter(T adapter) {
if (mObserver == null) {
mObserver = new PopupDataSetObserver(this);
} else if (mAdapter != null) {
mAdapter.unregisterDataSetObserver(mObserver);
}
mAdapter = adapter;
if (mAdapter != null) {
//noinspection unchecked
mFilter = ((Filterable) mAdapter).getFilter();
adapter.registerDataSetObserver(mObserver);
} else {
mFilter = null;
}
mPopup.setAdapter(mAdapter);
}
И последнее.Я также хотел знать рабочий пример WeakReference
в приложении Android, и я мог найти некоторые образцы в его официальных образцах приложений.Но я действительно не мог понять использование некоторых из них.Например, ThreadSample и DisplayingBitmaps приложения используют WeakReference
в своем коде, но после выполнения нескольких тестов я обнаружил, что метод get () никогда не возвращает null
, поскольку ссылается наобъект просмотра перерабатывается в адаптеры, а не в мусор.