Я следовал примеру использования WeakReference в AsyncTask, назначив слабую ссылку в конструкторе:
private final WeakReference<WeakClass> weakRef;
public WeakRefAsyncTask( @NotNull WeakClass _weakClassInstance ) {
weakRef = new WeakReference<>( _weakClassInstance );
}
protected final @NonNull WeakClass getWeakOne() {
WeakClass o = weakRef.get();
if( o != null ) {
return o;
} else {
throw new WeakRefIsNullException( getTaskDetailsDescription() );
}
}
Но теперь у меня возникает другая проблема - слабая ссылка время от времени обнуляется, даже если действие все еще работает (DoWeaklyAsyncTask является статическим внутренним наследником WeakRefAsyncTask в AbstractPurchaseListActivity).
03-19 11:02:19.632 5184-5305/com.tsarsprocket.purchaselist.subscribe E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #5
Process: com.tsarsprocket.purchaselist.subscribe, PID: 5184
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.tsarsprocket.DroidTools2.tools.WeakRefAsyncTask$WeakRefIsNullException: Weak reference is null. Task details:
Loading names already used in purchase list version, id=-1
at com.tsarsprocket.DroidTools2.tools.WeakRefAsyncTask.getWeakOne(WeakRefAsyncTask.java:37)
at com.tsarsprocket.purchaselist.core.AbstractPurchaseListActivity$DoWeaklyAsyncTask.doWeakInBackground(AbstractPurchaseListActivity.java:225)
at com.tsarsprocket.DroidTools2.tools.WeakRefAsyncTask.doInBackground(WeakRefAsyncTask.java:118)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more
Проблема в том, что действие все еще актуально, когда слабый рефлекс аннулируется и все еще нужны результаты acynctask. Я подозреваю, что это из-за агрессивного GC возможно. И задача не может сказать действию, что она провалилась, потому что слабая ссылка была единственной ссылкой.
Есть ли способ эффективно использовать слабые ссылки в асинхронных задачах И, чтобы предотвратить их сбой из-за аннулирования слабых ссылок, пожалуйста?