Я пытаюсь использовать класс WeakReference
, чтобы предотвратить утечку памяти в Android.WeakReference: ссылка уничтожена в течение «секунд»
Я разработал Bluetooth API, который позволяет двум устройствам Android общаться (клиент и сервер) с помощью Android Bluetooth SDK.
Этот API доступен в общей библиотеке (так что оба приложения имеют доступ к одному и тому же коду).
Проблема в том, что ссылка внутри моих слабых ссылок уничтожается в считанные секунды. Я попытался использовать пользовательский ReferenceQueue
, но ни один из его методов не называется!
Глядя на использование ОЗУ обоих устройств Android, я не вижу ничего страшного: очень низко, очень стабильно, потому что у меня есть отдельная активность с несколькими видами.
Я думал, что WeakReference
должен хранить ссылки на мои действия, если они не получают сбор мусора (это означает, что ссылки больше нет). Я ошибаюсь ?
[EDIT 1]
Чтобы предоставить дополнительные разъяснения, я буду публиковать некоторые теоретические код, который должен представлять собой то, что я пытаюсь сделать.
Класс BluetoothAPI
private WeakReference<BluetoothStateListener> stateListener;
public final void setProgressListener(@Nullable BluetoothProgressListener progressListener) {
this.progressListener = new WeakReference<>(progressListener, new Ref<>(context));
}
private synchronized void notifyProgress(final float percent) {
if (this.progressListener != null) {
final BluetoothProgressListener listener = this.progressListener.get();
if (listener != null) {
UIAccess.runOnUiThread(new Runnable() {
public final void run() {
listener.onProgress(percent);
}
});
} else {
Log.d(TAG, "Progress Listener is null!");
}
}
}
класса Activity A, внутри onCreate()
this.btAPI.setProgressListener(new BluetoothProgressListener() {
@UiThread
public final void onProgress(final float percent) {
final int progress = Math.round(percent * 10);
progressBar.setProgress(progress);
progressLabel.setText(getString(R.string.main_act_progress_status_tv_incoming, progress/10));
}
});
При получении данных, мой прогрессбар никогда не обновляется, потому что BluetoothProgressListener
всегда нулевой. Что оправдывает это?
Пожалуйста, отобразите код. – Fildor
Нет сильной ссылки анонимному слушателю. Так что это будет GC'd. Ожидаемое поведение. – Fildor
Как насчет «SoftReference»? Если активность будет уничтожена, GC собирает мои анонимные ссылки для слушателей в адресных ссылках? – Mackovich