最新Android图片加载神器之Fresco,基于各种使用场景的讲解(1),2024年最新面试直播岗位常见问题

最后是今天给大家分享的一些独家干货:

【Android开发核心知识点笔记】

【Android思维脑图(技能树)】

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【Android高级架构视频学习资源】

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

                .setMaxCacheSize(MAX_DISK_SMALL_CACHE_SIZE)

                .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_SMALL_ONLOWDISKSPACE_CACHE_SIZE)

                .build();



c、ImagePipeline的完整配置代码如下:



package com.facebook.fresco.helper.config;

import android.app.ActivityManager;

import android.content.Context;

import android.graphics.Bitmap;

import com.facebook.cache.disk.DiskCacheConfig;

import com.facebook.common.logging.FLog;

import com.facebook.common.memory.MemoryTrimType;

import com.facebook.common.memory.MemoryTrimmable;

import com.facebook.common.memory.MemoryTrimmableRegistry;

import com.facebook.common.memory.NoOpMemoryTrimmableRegistry;

import com.facebook.common.util.ByteConstants;

import com.facebook.drawee.backends.pipeline.Fresco;

import com.facebook.fresco.helper.utils.MLog;

import com.facebook.imagepipeline.backends.okhttp3.OkHttpImagePipelineConfigFactory;

import com.facebook.imagepipeline.core.ImagePipelineConfig;

import com.facebook.imagepipeline.decoder.ProgressiveJpegConfig;

import com.facebook.imagepipeline.image.ImmutableQualityInfo;

import com.facebook.imagepipeline.image.QualityInfo;

import com.facebook.imagepipeline.listener.RequestListener;

import com.facebook.imagepipeline.listener.RequestLoggingListener;

import java.io.File;

import java.util.HashSet;

import java.util.Set;

import okhttp3.OkHttpClient;

import okhttp3.logging.HttpLoggingInterceptor;

/**

  • Created by android_ls on 16/9/8.

*/

public class ImageLoaderConfig {

private static final String IMAGE_PIPELINE_CACHE_DIR = "image_cache";



private static final String IMAGE_PIPELINE_SMALL_CACHE_DIR = "image_small_cache";



private static final int MAX_DISK_SMALL_CACHE_SIZE = 10 * ByteConstants.MB;



private static final int MAX_DISK_SMALL_ONLOWDISKSPACE_CACHE_SIZE = 5 * ByteConstants.MB;



private static ImagePipelineConfig sImagePipelineConfig;



/**

 * Creates config using android http stack as network backend.

 */

public static ImagePipelineConfig getImagePipelineConfig(final Context context) {

    if (sImagePipelineConfig == null) {

        /**

         * 推荐缓存到应用本身的缓存文件夹,这么做的好处是:

         * 1、当应用被用户卸载后能自动清除缓存,增加用户好感(可能以后用得着时,还会想起我)

         * 2、一些内存清理软件可以扫描出来,进行内存的清理

         */

        File fileCacheDir = context.getApplicationContext().getCacheDir();

// if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

// fileCacheDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + “/Fresco”);

// }

        DiskCacheConfig mainDiskCacheConfig = DiskCacheConfig.newBuilder(context)

                .setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)

                .setBaseDirectoryPath(fileCacheDir)

                .build();



        DiskCacheConfig smallDiskCacheConfig = DiskCacheConfig.newBuilder(context)

                .setBaseDirectoryPath(fileCacheDir)

                .setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)

                .setMaxCacheSize(MAX_DISK_SMALL_CACHE_SIZE)

                .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_SMALL_ONLOWDISKSPACE_CACHE_SIZE)

                .build();



        FLog.setMinimumLoggingLevel(FLog.VERBOSE);

        Set<RequestListener> requestListeners = new HashSet<>();

        requestListeners.add(new RequestLoggingListener());



        // 当内存紧张时采取的措施

        MemoryTrimmableRegistry memoryTrimmableRegistry = NoOpMemoryTrimmableRegistry.getInstance();

        memoryTrimmableRegistry.registerMemoryTrimmable(new MemoryTrimmable() {

            @Override

            public void trim(MemoryTrimType trimType) {

                final double suggestedTrimRatio = trimType.getSuggestedTrimRatio();

                MLog.i(String.format("Fresco onCreate suggestedTrimRatio : %d", suggestedTrimRatio));



                if (MemoryTrimType.OnCloseToDalvikHeapLimit.getSuggestedTrimRatio() == suggestedTrimRatio

                        || MemoryTrimType.OnSystemLowMemoryWhileAppInBackground.getSuggestedTrimRatio() == suggestedTrimRatio

                        || MemoryTrimType.OnSystemLowMemoryWhileAppInForeground.getSuggestedTrimRatio() == suggestedTrimRatio

                        ) {

                    // 清除内存缓存

                    Fresco.getImagePipeline().clearMemoryCaches();

                }

            }

        });



        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();

        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient.Builder()

                .addInterceptor(loggingInterceptor)

// .retryOnConnectionFailure(false)

                .build();



        sImagePipelineConfig = OkHttpImagePipelineConfigFactory.newBuilder(context, okHttpClient)

// sImagePipelineConfig = ImagePipelineConfig.newBuilder(context)

                .setBitmapsConfig(Bitmap.Config.RGB_565) // 若不是要求忒高清显示应用,就用使用RGB_565吧(默认是ARGB_8888)

                .setDownsampleEnabled(true) // 在解码时改变图片的大小,支持PNG、JPG以及WEBP格式的图片,与ResizeOptions配合使用

                // 设置Jpeg格式的图片支持渐进式显示

                .setProgressiveJpegConfig(new ProgressiveJpegConfig() {

                    @Override

                    public int getNextScanNumberToDecode(int scanNumber) {

                        return scanNumber + 2;

                    }



                    public QualityInfo getQualityInfo(int scanNumber) {

                        boolean isGoodEnough = (scanNumber >= 5);

                        return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false);

                    }

                })

                .setRequestListeners(requestListeners)

                .setMemoryTrimmableRegistry(memoryTrimmableRegistry) // 报内存警告时的监听

                // 设置内存配置

                .setBitmapMemoryCacheParamsSupplier(new BitmapMemoryCacheParamsSupplier(

                        (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)))

                .setMainDiskCacheConfig(mainDiskCacheConfig) // 设置主磁盘配置

                .setSmallImageDiskCacheConfig(smallDiskCacheConfig) // 设置小图的磁盘配置

                .build();

    }

    return sImagePipelineConfig;

}

}




d、替换网络实现为okhttp3



   OkHttpClient okHttpClient = new OkHttpClient.Builder()

                .addInterceptor(loggingInterceptor)

// .retryOnConnectionFailure(false)

                .build();



        sImagePipelineConfig = OkHttpImagePipelineConfigFactory.newBuilder(context, okHttpClient)



e、支持调试时,显示图片加载的Log



FLog.setMinimumLoggingLevel(FLog.VERBOSE);

Set requestListeners = new HashSet<>();

requestListeners.add(new RequestLoggingListener());




f、内存缓存配置完整代码:



package com.facebook.fresco.helper.config;

import android.app.ActivityManager;

import android.os.Build;

import com.facebook.common.internal.Supplier;

import com.facebook.common.util.ByteConstants;

import com.facebook.fresco.helper.utils.MLog;

import com.facebook.imagepipeline.cache.MemoryCacheParams;

/**

  • 内存缓存配置

  • https://github.com/facebook/fresco/issues/738

  • Created by android_ls on 16/9/8.

*/

public class BitmapMemoryCacheParamsSupplier implements Supplier {

private final ActivityManager mActivityManager;



public BitmapMemoryCacheParamsSupplier(ActivityManager activityManager) {

    mActivityManager = activityManager;

}



@Override

public MemoryCacheParams get() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        return new MemoryCacheParams(getMaxCacheSize(), // 内存缓存中总图片的最大大小,以字节为单位。

                56,                                     // 内存缓存中图片的最大数量。

                Integer.MAX_VALUE,                      // 内存缓存中准备清除但尚未被删除的总图片的最大大小,以字节为单位。

                Integer.MAX_VALUE,                      // 内存缓存中准备清除的总图片的最大数量。

                Integer.MAX_VALUE);                     // 内存缓存中单个图片的最大大小。

    } else {

        return new MemoryCacheParams(

                getMaxCacheSize(),

                256,

                Integer.MAX_VALUE,

                Integer.MAX_VALUE,

                Integer.MAX_VALUE);

    }

}



private int getMaxCacheSize() {

    final int maxMemory = Math.min(mActivityManager.getMemoryClass() * ByteConstants.MB, Integer.MAX_VALUE);

    MLog.i(String.format("Fresco Max memory [%d] MB", (maxMemory/ByteConstants.MB)));

    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;

        }

    }

}

}




g、初始化Fresco



Fresco.initialize(context,ImageLoaderConfig.getImagePipelineConfig(context));




二、Fresco的各种使用场景



从网络加载一张图片



String url = “http://ww3.sinaimg.cn/large/610dc034jw1f6m4aj83g9j20zk1hcww3.jpg”;

ImageLoader.loadImage((SimpleDraweeView)findViewById(R.id.sdv_1), url);




1、显示一张图片



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_1"

        android:layout_width="90dp"

        android:layout_height="90dp"

        app:actualImageScaleType="centerCrop"/>



效果图如下:  

![](https://img-blog.csdn.net/20161112180419110)



2、显示一张圆形图片



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_2"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:roundAsCircle="true"/>



效果图如下:  

![](https://img-blog.csdn.net/20161112180445778)



3、显示一张圆形带边框的图片



    <com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_3"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:roundAsCircle="true"

        app:roundingBorderColor="#fff3cf44"

        app:roundingBorderWidth="2dp"/>



效果图如下:  

![](https://img-blog.csdn.net/20161112180511314)



4、显示一张圆角图片



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_4"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:roundAsCircle="false"

        app:roundedCornerRadius="10dp"/>



效果图如下:  

![](https://img-blog.csdn.net/20161112180545080)



5、显示一张底部是圆角的图片



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_5"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:roundAsCircle="false"

        app:roundedCornerRadius="10dp"

        app:roundTopLeft="false"

        app:roundTopRight="false"

        app:roundBottomLeft="true"

        app:roundBottomRight="true"/>



效果图如下:  

![](https://img-blog.csdn.net/20161112180614872)



6、显示一张左上和右下是圆角的图片



 <com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_6"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:roundAsCircle="false"

        app:roundedCornerRadius="10dp"

        app:roundTopLeft="true"

        app:roundTopRight="false"

        app:roundBottomLeft="false"

        app:roundBottomRight="true"/>



效果图如下:  

![](https://img-blog.csdn.net/20161112180633857)



7、设置占位图



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_7"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:placeholderImage="@mipmap/ic_launcher"

        app:placeholderImageScaleType="centerCrop" />



8、带动画的显示(从半透明到不透明)



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_8"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:fadeDuration="3000"/>



9、图层叠加显示



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_10"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:overlayImage="@mipmap/ic_launcher"/>



10、其它的属性的配置,比如加载进度、加载失败、重试图



<com.facebook.drawee.view.SimpleDraweeView

        android:id="@+id/sdv_11"

        android:layout_width="90dp"

        android:layout_height="90dp"

        android:layout_marginTop="15dp"

        app:actualImageScaleType="centerCrop"

        app:failureImage="@mipmap/ic_launcher"

        app:failureImageScaleType="centerInside"

        app:retryImage="@mipmap/ic_launcher"

        app:retryImageScaleType="centerCrop"

        app:progressBarImage="@mipmap/ic_launcher"

        app:progressBarImageScaleType="centerCrop"

        app:progressBarAutoRotateInterval="5000"/>



11、从本地文件(比如SDCard上)加载图片



public static void loadFile(final SimpleDraweeView draweeView, String filePath, final int reqWidth, final int reqHeight) {

    Uri uri = new Uri.Builder()

            .scheme(UriUtil.LOCAL_FILE_SCHEME)

            .path(filePath)

            .build();

    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)

            .setRotationOptions(RotationOptions.autoRotate())

            .setLocalThumbnailPreviewsEnabled(true)

            .setResizeOptions(new ResizeOptions(reqWidth, reqHeight))

            .build();

    DraweeController controller = Fresco.newDraweeControllerBuilder()

            .setImageRequest(request)

            .setOldController(draweeView.getController())

            .setControllerListener(new BaseControllerListener<ImageInfo>() {

                @Override

                public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) {

                    if (imageInfo == null) {

                        return;

                    }



                    ViewGroup.LayoutParams vp = draweeView.getLayoutParams();

                    vp.width = reqWidth;

                    vp.height = reqHeight;

                    draweeView.requestLayout();

                }

            })

            .build();

    draweeView.setController(controller);

}



使用:



ImageLoader.loadFile((SimpleDraweeView)itemView, photoInfo.thumbnailUrl, 120, 120);




12、从本地资源(Resources)加载图片



public static void loadDrawable(SimpleDraweeView draweeView, int resId) {

    Uri uri = new Uri.Builder()

            .scheme(UriUtil.LOCAL_RESOURCE_SCHEME)

            .path(String.valueOf(resId))

            .build();

    DraweeController controller = Fresco.newDraweeControllerBuilder()

            .setUri(uri)

            .setOldController(draweeView.getController())

            .build();

    draweeView.setController(controller);

}



使用:



ImageLoader.loadDrawable(simpleDraweeView, R.drawable.meizi);




效果图如下:  

![](https://img-blog.csdn.net/20161112180841944)



13、对图片进行性高斯模糊处理



public static void loadImageBlur(final SimpleDraweeView draweeView, String url) {

    loadImage(draweeView, url, new BasePostprocessor() {

        @Override

        public String getName() {

            return "blurPostprocessor";

        }



        @Override

        public void process(Bitmap bitmap) {

            BitmapBlurHelper.blur(bitmap, 35);

        }

    });

}



其内部调用的方法



public static void loadImage(SimpleDraweeView simpleDraweeView, String url, BasePostprocessor processor) {

    if (TextUtils.isEmpty(url)) {

        return;

    }



    Uri uri = Uri.parse(url);

    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)

            .setRotationOptions(RotationOptions.autoRotate())

            .setPostprocessor(processor)

            .build();

    DraweeController controller = Fresco.newDraweeControllerBuilder()

            .setImageRequest(request)

            .setOldController(simpleDraweeView.getController())

            .build();

    simpleDraweeView.setController(controller);

}



使用:



String url = “http://a.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938d3de795ad0628535e4dd6fe2.jpg”;

SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);

simpleDraweeView.setAspectRatio(0.7f);

ViewGroup.LayoutParams lvp = simpleDraweeView.getLayoutParams();

lvp.width = DensityUtil.getDisplayWidth(this);

ImageLoader.loadImageBlur(simpleDraweeView, url,

            DensityUtil.getDisplayWidth(this), DensityUtil.getDisplayHeight(this));



效果图如下:  

![](https://img-blog.csdn.net/20161112180917335)



14、我们知道使用Fresco加载并显示一张图片,需要指定SimpleDraweeView的宽高或者指定其中一个值并设置宽高比,可是我真的不知道要显示的图片有多大,该显示多大?可以帮我搞定吗?答案是肯定的。



    String url = "http://feed.chujianapp.com/20161108/452ab5752287a99a1b5387e2cd849006.jpg@1080w";

    SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);

    ImageLoader.loadImage(simpleDraweeView, url, new SingleImageControllerListener(simpleDraweeView));



15、从网络加载并显示gif格式的图片



String url = “http://img4.178.com/acg1/201506/227753817857/227754566617.gif”;

SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);

ImageLoader.loadImage(simpleDraweeView, url);




16、加载并显示webp格式的图片



    SimpleDraweeView simpleDraweeView = (SimpleDraweeView)findViewById(R.id.sdv_1);

    ViewGroup.LayoutParams lvp = simpleDraweeView.getLayoutParams();

    lvp.width = DensityUtil.getDisplayWidth(this);

    simpleDraweeView.setAspectRatio(0.6f); // 设置宽高比



    ImageLoader.loadDrawable(simpleDraweeView, R.drawable.meizi_webp,

            DensityUtil.getDisplayWidth(this), DensityUtil.getDisplayHeight(this));



其中R.drawable.meizi\_webp为meizi\_webp.webp



17、从内存缓存中移除指定图片的缓存



       if (!TextUtils.isEmpty(photoInfo.originalUrl)) {

            ImagePipeline imagePipeline = Fresco.getImagePipeline();

            Uri uri = Uri.parse(photoInfo.originalUrl);

            if (imagePipeline.isInBitmapMemoryCache(uri)) {

                imagePipeline.evictFromMemoryCache(uri);

            }

        }



18、从磁盘缓存中移除指定图片的缓存



    ImagePipeline imagePipeline = Fresco.getImagePipeline();

    Uri uri = Uri.parse(photoInfo.originalUrl);

    // 下面的操作是异步的

    if (imagePipeline.isInDiskCacheSync(uri)) {

        imagePipeline.evictFromDiskCache(uri);

    }



19、清空磁盘缓存



Fresco.getImagePipeline().clearDiskCaches();




20、清空内存缓存



Fresco.getImagePipeline().clearMemoryCaches();




21、清空缓存(内存缓存 + 磁盘缓存)



Fresco.getImagePipeline().clearCaches();




22、在列表视图滚动时,不加载图片,等滚动停止后再开始加载图片,提升列表视图的滚动流畅度。



// 需要暂停网络请求时调用

public static void pause(){

    Fresco.getImagePipeline().pause();

}



// 需要恢复网络请求时调用

public static void resume(){

    Fresco.getImagePipeline().resume();

}



23、下载图片存储到指定的路径



/**

 * 从网络下载图片

 * 1、根据提供的图片URL,获取图片数据流

 * 2、将得到的数据流写入指定路径的本地文件

 *

 * @param url            URL

 * @param loadFileResult LoadFileResult

 */

public static void downloadImage(Context context, String url, final DownloadImageResult loadFileResult) {

    if (TextUtils.isEmpty(url)) {

        return;

    }



    Uri uri = Uri.parse(url);

    ImagePipeline imagePipeline = Fresco.getImagePipeline();

    ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(uri);

    ImageRequest imageRequest = builder.build();



    // 获取未解码的图片数据

    DataSource<CloseableReference<PooledByteBuffer>> dataSource = imagePipeline.fetchEncodedImage(imageRequest, context);

最后

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
Android进阶视频+面试资料部分截图

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

的路径


  /**

     * 从网络下载图片

     * 1、根据提供的图片URL,获取图片数据流

     * 2、将得到的数据流写入指定路径的本地文件

     *

     * @param url            URL

     * @param loadFileResult LoadFileResult

     */

    public static void downloadImage(Context context, String url, final DownloadImageResult loadFileResult) {

        if (TextUtils.isEmpty(url)) {

            return;

        }



        Uri uri = Uri.parse(url);

        ImagePipeline imagePipeline = Fresco.getImagePipeline();

        ImageRequestBuilder builder = ImageRequestBuilder.newBuilderWithSource(uri);

        ImageRequest imageRequest = builder.build();



        // 获取未解码的图片数据

        DataSource<CloseableReference<PooledByteBuffer>> dataSource = imagePipeline.fetchEncodedImage(imageRequest, context);



## **最后**

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
[外链图片转存中...(img-y4WLT3Su-1715367166508)]




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值