gpt4 book ai didi

java - RecyclerView 中的 AsyncTask 抛出 You can not start a load for a destroyed Activity on Callback

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:15 24 4
gpt4 key购买 nike

我有一个 RecyclerView 适配器,每隔几秒就会更新一次。每次它调用 AsyncTask 时,都会从服务器检索数据,然后调用适配器内部的以下方法:

public static void updateItem(final FavoritesViewHolder holder, DBHelper dbHelper, int position, Channel channel, Context context, boolean success) {
Glide.with(context).load(channel.getAvatar())
.error(R.drawable.youtube_default_avatar)
.placeholder(R.drawable.youtube_default_avatar)
.into(holder.channelAvatarView);
dbHelper.updateFavorites(channels.get(position));
Glide.get(context).clearMemory();
}

(我删除了几行,它们对这个问题没有影响)

但是,如果用户快速关闭应用程序或转到另一个应用程序,并且 AsyncTask 刚刚调用该方法(是的,AsyncTask 正在被取消,不用担心,它成功完成并调用此方法),Glide 会抛出以下错误:

java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134)
at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102)
at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:87)
at com.bumptech.glide.Glide.with(Glide.java:629)
at it.bjarn.xxx.xxx.adapters.FavoritesAdapter.updateItem(FavoritesAdapter.java:204)
at it.bjarn.xxx.xxx.tasks.FavoriteUpdateTask.onPostExecute(FavoriteUpdateTask.java:104)
at it.bjarn.xxx.xxx.tasks.FavoriteUpdateTask.onPostExecute(FavoriteUpdateTask.java:27)
at android.os.AsyncTask.finish(AsyncTask.java:667)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:684)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

这是我的 AsyncTask 的 onPostExecute():

protected void onPostExecute(AsyncTaskResult<Channel> result) {
if (result.getError() != null) {
Log.e("FavoritesUpdateTask", "Exception while retrieving results: " + result.getError().toString());
Glide.get(mContext).clearMemory();
} else if (isCancelled()) {
Log.d("FavoritesUpdateTask", "Cancelled");
Glide.get(mContext).clearMemory();
} else {
Log.d("FavoritesUpdateTask", "Succesfully returned channel object");
FavoritesAdapter.updateItem(mHolder, mDbHelper, mPosition, result.getResult(), mContext, true);
}
}

//编辑:

我还尝试从适配器取消任务,因为我无法从 Activity 本身取消它(FavoritesUpdateTask 位于适配器内部,这也是在 onBindViewHolder() 中调用它的地方):

@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
if (favoriteUpdateTask != null) {
favoriteUpdateTask.cancel(true);
}
}

最佳答案

我认为..这就是问题所在。

        Glide.with(context).

因为,这里的 Activity 已被销毁,并且它仍在使用被销毁 Activity 的上下文。

关于java - RecyclerView 中的 AsyncTask 抛出 You can not start a load for a destroyed Activity on Callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439340/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com