Java 및 Android 개발에서 WeakReference를 사용하는 방법
저는 자바 개발자로 2년간 근무하고 있습니다.
하지만 나는 내 코드에 WeakReference를 써본 적이 없다.WeakReference를 사용하여 어플리케이션, 특히 Android 어플리케이션의 효율을 높이는 방법
「」의 WeakReference
안드로이드의 경우 기존 Java에서 사용하는 것과 다르지 않습니다.
개체에 대한 참조가 필요할 때마다 개체를 사용할 것을 고려해야 하지만 가비지 컬렉터로부터 개체를 보호하려면 이 참조를 사용하지 마십시오.인 예로는 때 들 수 은 가비지 수집을 하다).WeakHashMap
를 참조해 주세요.
SoftReference
★★★★★★★★★★★★★★★★★」PhantomReference
뿐만 아니라.
편집: Tom은 캐시 구현에 대해 몇 가지 우려를 제기했습니다.WeakHashMap
다음은 문제를 설명하는 기사입니다.WeakHashMap은 캐시가 아닙니다!
넷빈의 퍼포먼스 저하에 대한 불만이 있었던 것은 톰의 말이 맞다.WeakHashMap
캐싱하고 있습니다.
이 될 것 요.WeakHashMap
후, 시, 시, 시 등으로 구현된 합니다.SoftReference
실제 환경에서는 Apache JCS와 같은 서드파티 라이브러리를 사용하는 것이 더 합리적이기 때문에 이러한 솔루션을 사용하지 않을 수 있습니다.
[EDIT2] 또 다른 좋은 예를 찾았습니다.WeakReference
. 비트맵 처리 비트맵 효율적인 트레이닝 가이드의 UI 스레드 해제 페이지에는 다음 중 하나의 사용법이 나와 있습니다.WeakReference
비동기 태스크에 있습니다.
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에 대한 WeakReference는 ImageView 및 ImageView에서 참조되는 모든 것이 가비지 수집되는 것을 AsyncTask에 의해 방지하지 않습니다.작업이 완료되었을 때 ImageView가 아직 남아 있다는 보장은 없습니다.따라서 onPost에서도 참조를 확인해야 합니다.실행().예를 들어 사용자가 액티비티에서 벗어나거나 태스크가 완료되기 전에 설정 변경이 발생한 경우 ImageView가 존재하지 않을 수 있습니다.
해피 코딩!
[Edit] 정말 좋은 예시를 찾았어요WeakReference
facebook-facebook-facebook-facebook에서ToolTipPopup 클래스는 앵커 뷰 위에 툴팁을 표시하는 단순한 위젯 클래스일 뿐입니다.캡처했어요.
수업은 정말 간단해서 볼만해요. 클래스에서는, 그업 in in inWeakReference
하기 위해 수입니다.class.class는 앵커뷰를 참조할 때 이것은 매우 의미가 있습니다.
해피 코딩! :)
예를 .WeakReference
Android 프레임워크 위젯의 코드 조각입니다.
요컨대, WeakReference
class를 사용하여 View
이 예에서는 메모리 누수를 방지하기 위한 객체입니다.
PopupDataSetObserver의 이 클래스는 네스트된 클래스입니다.AutoCompleteTextView
정말 간단해서 댓글로 설명을 잘 해드릴게요. Coding ! 딩! :! :)
/**
* 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);
}
지지마, ,, 이, 이, 이, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, 고, example, example, example, example, example example, ,WeakReference
Android 어플리케이션에서 샘플을 찾을 수 있었습니다.하지만 나는 그들 중 몇 가지는 정말 이해할 수 없었다.예를 들어 ThreadSample 및 DisplayingBitmaps 응용 프로그램은WeakReference
코드에서는 몇 테스트를 get가 get()을 하지 않는다는 .null
참조된 뷰 오브젝트는 가비지 수집이 아닌 어댑터로 재활용되기 때문입니다.
다른 답변 중에는 불완전하거나 지나치게 긴 답변도 있습니다.일반적인 답은 다음과 같습니다.
Java 및 Android에서 WeakReference를 사용하는 방법
다음의 순서를 실행할 수 있습니다.
- 작성하다
WeakReference
- 약한 참조 설정
- 약한 참조 사용
코드
MyClass
에 대한 AnotherClass
.
public class MyClass {
// 1. Create a WeakReference variable
private WeakReference<AnotherClass> mAnotherClassReference;
// 2. Set the weak reference (nothing special about the method name)
void setWeakReference(AnotherClass anotherClass) {
mAnotherClassReference = new WeakReference<>(anotherClass);
}
// 3. Use the weak reference
void doSomething() {
AnotherClass anotherClass = mAnotherClassReference.get();
if (anotherClass == null) return;
// do something with anotherClass
}
}
AnotherClass
에 MyClass
.
public class AnotherClass {
// strong reference
MyClass mMyClass;
// allow MyClass to get a weak reference to this class
void someMethod() {
mMyClass = new MyClass();
mMyClass.setWeakReference(this);
}
}
메모들
- 약한 참조가 필요한 이유는 가비지 컬렉터가 더 이상 필요하지 않은 개체를 폐기할 수 있기 때문입니다.두 개체가 서로에 대한 강한 참조를 유지하는 경우 가비지 수집이 불가능합니다.메모리 누수입니다.
- 두 물체가 서로 참조할 필요가 있는 경우 객체 A(일반적으로 수명이 짧은 객체)는 객체 B(일반적으로 수명이 긴 객체)에 대한 참조가 약한 반면 B는 객체 A에 대한 참조가 강해야 합니다.에서는 " " " 입니다.
MyClass
와 A와이었다.AnotherClass
B.B'였다. - " " 를 하는
WeakReference
다른 클래스에 인터페이스를 실장하는 것입니다.이것은 Listener/Observer Pattern에서 수행됩니다.
실제적인 예
"표준화된" 매핑은 대상 객체의 인스턴스 하나를 메모리에 보관하고 다른 모든 인스턴스는 포인터 또는 somesuch 메커니즘을 통해 특정 인스턴스를 검색합니다.이것이 약한 참조가 도움이 될 수 있는 부분입니다.즉, WeakReference 개체를 사용하여 시스템 내의 개체에 대한 포인터를 만들 수 있지만 개체 범위를 벗어난 개체는 가비지 컬렉터에 의해 회수될 수 있습니다.예를 들어 다음과 같은 코드가 있는 경우:
class Registry {
private Set registeredObjects = new HashSet();
public void register(Object object) {
registeredObjects.add( object );
}
}
는 GC 되어 있는 가 있기 되지 않습니다.이는 오브젝트에 대한 참조가 다음 세트에 저장되어 있기 때문입니다.registeredObjects
다음 중 하나:
class Registry {
private Set registeredObjects = new HashSet();
public void register(Object object) {
registeredObjects.add( new WeakReference(object) );
}
}
그런 다음 GC가 Set 내의 개체를 회수할 수 있습니다.캐싱, 카탈로그 작성 등에 이 기술을 사용할 수 있습니다.GC 및 캐싱에 대한 자세한 설명은 아래를 참조하십시오.
언급URL : https://stackoverflow.com/questions/3243215/how-to-use-weakreference-in-java-and-android-development
'programing' 카테고리의 다른 글
C 표준 라이브러리의 어떤 기능이 일반적으로 나쁜 관행을 장려합니까? (0) | 2022.07.27 |
---|---|
#의존관계추적도구 (0) | 2022.07.27 |
Java 어레이의 사이즈는 최대입니까? (0) | 2022.07.27 |
Vuex 작업 내에서 상태를 직접 조작하는 경우와 'commit' 및 'getters'를 사용하는 경우의 비교 (0) | 2022.07.27 |
Vue Storefront: 옵션 ID 대신 커스텀 속성 필터 라벨 표시 (0) | 2022.07.27 |