博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react-native内存优化--图片内存
阅读量:6891 次
发布时间:2019-06-27

本文共 4576 字,大约阅读时间需要 15 分钟。

hot3.png

    react-native在android中使用fresco来加载图片。说到fresco很多人都会为之欢呼,总比各种轮子内存调优的好。不过在react-native中在它的使用fresco还是稍显随意,如果一个页面是典型的图列表,运行一段时间用dumpsys meminfo命令观察您的程序内存会出现令您惊讶的内存暴增。

    为了使得图片内存好看点,我们来修改以下react-native的FrescoModule模块。

public class MyFrescoModule extends ReactContextBaseJavaModule implements        ModuleDataCleaner.Cleanable {    private @Nullable    ImagePipelineConfig mConfig;    public MyFrescoModule(ReactApplicationContext reactContext) {        this(reactContext, getDefaultConfig(reactContext, null, null));    }    public MyFrescoModule(ReactApplicationContext reactContext, RequestListener listener) {        this(reactContext, getDefaultConfig(reactContext, listener, null));    }    public MyFrescoModule(            ReactApplicationContext reactContext,            RequestListener listener,            DiskCacheConfig diskCacheConfig) {        this(reactContext, getDefaultConfig(reactContext, listener, diskCacheConfig));    }    public MyFrescoModule(ReactApplicationContext reactContext, ImagePipelineConfig config) {        super(reactContext);        mConfig = config;    }    @Override    public void initialize() {        super.initialize();        // Make sure the SoLoaderShim is configured to use our loader for native libraries.        // This code can be removed if using Fresco from Maven rather than from source        SoLoaderShim.setHandler(new MyFrescoModule.FrescoHandler());        Context context = getReactApplicationContext().getApplicationContext();        Fresco.initialize(context, mConfig);        mConfig = null;    }    @Override    public String getName() {        return "FrescoModule";    }    @Override    public void clearSensitiveData() {        // Clear image cache.        ImagePipelineFactory imagePipelineFactory = Fresco.getImagePipelineFactory();        imagePipelineFactory.getBitmapMemoryCache().removeAll(AndroidPredicates.
True()); imagePipelineFactory.getEncodedMemoryCache().removeAll(AndroidPredicates.
True()); } private static ImagePipelineConfig getDefaultConfig( Context context, @Nullable RequestListener listener, @Nullable DiskCacheConfig diskCacheConfig) { HashSet
requestListeners = new HashSet<>(); requestListeners.add(new SystraceRequestListener()); if (listener != null) { requestListeners.add(listener); } OkHttpClient okHttpClient = OkHttpClientProvider.getOkHttpClient(); ImagePipelineConfig.Builder builder = OkHttpImagePipelineConfigFactory.newBuilder(context.getApplicationContext(), okHttpClient); builder .setDownsampleEnabled(false) .setRequestListeners(requestListeners); if (diskCacheConfig != null) { builder.setMainDiskCacheConfig(diskCacheConfig); } final int maxCacheSize= getMaxCacheSize(context); builder.setBitmapMemoryCacheParamsSupplier(new Supplier
() { @Override public MemoryCacheParams get() { return new MemoryCacheParams(maxCacheSize,100,0,Integer.MAX_VALUE, Integer.MAX_VALUE); } }); return builder.build(); } private static int getMaxCacheSize(Context context) { final ActivityManager activityManager=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); final int maxMemory = Math.min(activityManager.getMemoryClass() * ByteConstants.MB, Integer.MAX_VALUE); if (maxMemory < 32 * ByteConstants.MB) { return 4 * ByteConstants.MB; } else if (maxMemory < 64 * ByteConstants.MB) { return 6 * ByteConstants.MB; } else { // We don't want to use more ashmem on Gingerbread for now, since it doesn't respond well to // native memory pressure (doesn't throw exceptions, crashes app, crashes phone) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { return 8 * ByteConstants.MB; } else { return maxMemory / 4; } } } private static class FrescoHandler implements SoLoaderShim.Handler { @Override public void loadLibrary(String libraryName) { SoLoader.loadLibrary(libraryName); } }}

这里我们重新实现了MyFrescoModule,之所以不继承FrescoModule是因为FrescoModule里的getDefaultConfig函数是static的。

    下一步继承MainReactPackage 替换掉MainReactPackage ,override createNativeModules方法将FrescoModule替换成MyFrescoModule。

最后run起来再看看您的应用内存是怎样的。祝您好运!

转载于:https://my.oschina.net/droidwolf/blog/759541

你可能感兴趣的文章
IDF2011:基于SaaS模式的"教学云"案例
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第七章:基本系统配置- 7.5. 配置系统时间...
查看>>
云计算你必须思考的8大问题
查看>>
Windows7 Debug Test
查看>>
HTTPS连接的前几毫秒发生了什么
查看>>
从变量到封装:一文带你为机器学习打下坚实的Python基础
查看>>
给大家共享一个基本算法包
查看>>
Riverbed:SDN向广域网扩展为企业带来哪些价值
查看>>
定义中国网络安全市场战略高度,绿盟科技为“互联网+”保驾护航
查看>>
听听第一个在Devops技术领域“吃螃蟹”者的心声
查看>>
《数学建模:基于R》——1.3 非参数检验
查看>>
多维防护:虚拟化安全挑战的破解之道
查看>>
解决外部虚拟网络交换机导致的网络连接问题
查看>>
大数据可视化 让一张图胜过千言万语
查看>>
《PIC微控制器项目设计:C语言》一3.1 PICDEM PIC18 Explorer开发板
查看>>
闪存时代来临 融合高端存储
查看>>
三亚信息化建设点亮“智慧城市”
查看>>
IBM和联合航空公司就企业iOS应用程序展开合作
查看>>
《中国人工智能学会通讯》——12.34 自适应众包任务分配技术
查看>>
物联网兴起 嵌入式系统安全日益受关注
查看>>