使用带有webview的内容提供程序时遇到问题,基本上它会导致内存泄漏。
当我通过http Vs content://
加载相同的内容时,我可以清楚地看到这一点 - 当使用http和强制垃圾收集时,使用是静态的,但是当使用内容提供程序并强制垃圾收集时,我得到了这个:
GC_EXPLICIT freed 304K, 6% free 23582K/24839K, paused 3ms+5ms
页面重新加载后:
GC_EXPLICIT freed 304K, 5% free 24607K/25863K, paused 15ms+25ms
将此识别为我的泄漏是我试图插上它..
如何在重新加载webview或加载其他页面时强制释放通过提供程序加载的内容。
内容提供商是标准的fayre:
public class LocalFileContentProvider extends ContentProvider {
private static final String URI_PREFIX = "content://com.content.mine";
public static String constructUri(String url) {
Uri uri = Uri.parse(url);
return uri.isAbsolute() ? url : URI_PREFIX + url;
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
try {
File file = new File(uri.getPath());
if (file.isDirectory())
return null;
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
return parcel;
} catch (Exception e) {
return null;
}
}
@Override
public boolean onCreate() {
return true;
}
@Override
public int delete(Uri uri, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public String getType(Uri uri) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public Cursor query(Uri uri, String[] as, String s, String[] as1, String s1) {
throw new UnsupportedOperationException("Not supported by this provider");
}
@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
throw new UnsupportedOperationException("Not supported by this provider");
}
}
使用垫我可以看到
Label Number of Objects Used Heap Size Retained Heap Size
byte[] First 10 of 483 objects 483 15,834,672 15,834,672
并查看对象,这似乎是保留的网页内容。