gpt4 book ai didi

android - 在属于适配器的 View 中正确释放资源

转载 作者:太空狗 更新时间:2023-10-29 15:00:34 26 4
gpt4 key购买 nike

我的列表适配器创建了一些 Views (普通 View 和标题 View )使用不断运行的计时器来循环显示图像。

我想知道释放那些计时器和其他与 View 相关的资源的合适方法是什么,我的意思是,了解项目 View 的最佳实践(由 Adapter.getView 创建)不再可见/不再需要,或者已被回收或取消附加,甚至它们的父小部件未在使用中。

我理想地在 View 中寻找方法/事件/监听器本身,而不是必须委托(delegate)事件的父 Widget。我想知道

  • View被提供给回收商(即 - 它已经退出屏幕,等等)
  • View可以被销毁(即 - 包含的小部件已被销毁)

到目前为止,我想我还没有找到合适的、防故障事件(如果有的话)。

我试过了 View.onAttachedToWindow()/View.onDetachedFromWindow()但是,反对 onAttachedToWindow这似乎总是被正确地称为,onDetachedFromWindow不是。 它似乎只在回收 View 将要被重用时调用,但在其他情况下不会调用,例如 View 时。进入回收池(退出屏幕),或者当小部件被销毁时,甚至当 Activity 结束时。

有什么建议吗?

编辑:

我一直在做一些测试,发现 onDetachedFromWindow parent widget 是可靠的。目前我的解决方案是将该事件传播到适配器,它会依次在屏幕上找到 View (getFirstVisiblePosition ...)并手动触发一个onDetachedFromWindow。使用下面的代码,但是,你知道,这非常难看。我确信有更好的方法。

// ugly function to trigger an onDetachedFromWindow to any view
// leeched from com.tonicartos.widget.stickygridheaders.StickyGridHeadersGridView
public static void detachHeader(View header) {
if (header == null) { return; }

try {
Method method = View.class.getDeclaredMethod("dispatchDetachedFromWindow");
method.setAccessible(true);
method.invoke(header);
} catch (NoSuchMethodException e) {
throw new RuntimePlatformSupportException(e);
} catch (IllegalArgumentException e) {
throw new RuntimePlatformSupportException(e);
} catch (IllegalAccessException e) {
throw new RuntimePlatformSupportException(e);
} catch (InvocationTargetException e) {
throw new RuntimePlatformSupportException(e);
}
}

最佳答案

RecyclerView.Adapter 有一个方法可以在 View 被回收时通知您。看看

public void onViewRecycled(RecyclerView.ViewHolder holder);

关于android - 在属于适配器的 View 中正确释放资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27308063/

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