android - 尽管仍然显示 Activity,但 AsyncTask 中的 WeakReference 无效
问题描述
通过在构造函数中分配弱引用,我遵循了在 AsyncTask 中使用 WeakReference 的模式:
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 是 AbstractPurchaseListActivity 中 WeakRefAsyncTask 的静态内部后代)。
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。并且任务不能告诉活动它失败了,因为弱引用是唯一的链接。
请问有什么方法可以在异步任务中有效地使用弱引用并防止异步任务由于弱引用无效而失败?
解决方案
推荐阅读
- algorithm - 有向图中的欧拉电路
- python - How To Clear a Label Assigned to a Grid in Specific Scenario Tkinter
- websphere - 在 WAS 中创建集群服务器
- bash - 在bash中使用while循环匹配行的问题
- firebase - PlatformException(ERROR_INVALID_EMAIL,电子邮件地址格式错误。,null)
- pine-script - 我只能在我的编码脚本中添加最多 5 个脚本
- node.js - 无法从 Broker 中的 MQTT 消息解析 JSON
- javascript - 如何在html表格中检测元素并分组
- javascript - 如何获取在 Javascript 中拆分我的字符串的分隔符?
- c# - 如何修改 ASP.NET Core 中的默认 Authorize 属性?