gpt4 book ai didi

Android - 注销适配器中定义的 ContentObserver

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

我有一系列文件要上传。这些作为条目存储在内容提供者中。每个条目还包含上传的百分比。

一个 Activity 显示上传列表,每个文件都是一个项目,带有 ProgressBar 以显示上传进度。

我更新进度条的方式是通过 ContentObserver。在 CursorAdaptor 中,我为每个项目定义了一个 ContentObserver,并将其保存为相应 View 的标签。

我现在的问题是我不知道什么时候取消注册这样的 ContentObservers。我找到的唯一方法是在包含 Activity 的 onDestroy() 中:

    for (int i = 0; i < mListView.getChildCount(); i++) {
final View v = mListView.getChildAt(i);
final ContentObserver obs = (ContentObserver) v.getTag();
if (obs != null) {
getContentResolver().unregisterContentObserver(obs);
}
}

这真的很糟糕。它在适配器和父 Activity 之间引入了依赖关系。另一方面,非未注册的 ContentObservers 可以防止 Activity 被破坏,引入内存泄漏。

您有更好的方法吗?

最佳答案

如果您有内容提供商,则可以改用 CursorLoader。

https://developer.android.com/training/load-data-background/setup-loader.html

public class PhotoThumbnailFragment extends FragmentActivity implements
LoaderManager.LoaderCallbacks<Cursor> {
...
}

/*
* Callback that's invoked when the system has initialized the Loader and
* is ready to start the query. This usually happens when initLoader() is
* called. The loaderID argument contains the ID value passed to the
* initLoader() call.
*/
@Override
public Loader<Cursor> onCreateLoader(int loaderID, Bundle bundle)
{
/*
* Takes action based on the ID of the Loader that's being created
*/
switch (loaderID) {
case URL_LOADER:
// Returns a new CursorLoader
return new CursorLoader(
getActivity(), // Parent activity context
mDataUrl, // Table to query
mProjection, // Projection to return
null, // No selection clause
null, // No selection arguments
null // Default sort order
);
default:
// An invalid id was passed in
return null;
}
}

您只需定义一个游标加载器并实现回调,不需要内容观察器。效果更好。

关于Android - 注销适配器中定义的 ContentObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16943450/

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