【笔记整理】Glide 4.9.0 关于监听生命周期

Android面试进阶:从生命周期到架构设计,掌握核心原理与工程实践 在Android开发领域,理解核心组件原理与系统机制是构建稳定、高性能应用的基础。Activity、Fragment等组件的生命周期管理,不仅是面试高频考点,更是处理页面状态、数据恢复与内存管理的工程实践核心。其背后涉及系统对应用进程与任务栈的调度原理,深刻理解这些机制,能有效避免内存泄漏与状态不一致问题,提升应用健壮性。随着Jetpack架构组件的普及,ViewModel、LiveData等现代技术方案,为数据驱动UI和生命周期感知编程提供了标准化支持,推动了MVVM等架构模式在工程中的落地。这些技术价值 阅读详情

在 Glide 4.9.0 执行流程源码解析 中说过,对于 with() 方法传递的参数(包括 Activity、Fragment、View 等),如果对应的 context 为非 Application 类型的,Glide 会为作为参数传递进with() 方法的 Activity 或者 Fragment 添加一个隐藏的且隐藏的(即没有 UI 的) Fragment(SupportRequestManagerFragment 或者 RequestManagerFragment 类型),用以监测 Activity 或者 Fragment 的生命周期,如果起被销毁,则 Glide 是可以感知到的,从而停止加载图片到指定的 View 中。

对于 SupportRequestManagerFragment 与 RequestManagerFragment 在实现原理上类似,只不过是因为 v4 包的原因而分别实现的。下面以 SupportRequestManagerFragment 为例子。

// RequestManagerRetriever.java
private RequestManager supportFragmentGet(
    @NonNull Context context,
    @NonNull FragmentManager fm,
    @Nullable Fragment parentHint,
    boolean isParentVisible) {
    
  SupportRequestManagerFragment current =
      getSupportRequestManagerFragment(fm, parentHint, isParentVisible);
  RequestManager requestManager = current.getRequestManager();
  if (requestManager == null) {
    // TODO(b/27524013): Factor out this Glide.get() call.
    Glide glide = Glide.get(context);
    // 构建一个新的 RequestManager
    requestManager =
        factory.build(
            glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
    current.setRequestManager(requestManager);
  }
  return requestManager;
}

private SupportRequestManagerFragment getSupportRequestManagerFragment(
    @NonNull final FragmentManager fm, @Nullable Fragment parentHint, boolean isParentVisible) {
  SupportRequestManagerFragment current =
      (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
  if (current == null) {
    // 先从 pendingSupportRequestManagerFragments 中去获取
    current = pendingSupportRequestManagerFragments.get(fm);
    if (current == null) {
      // 获取不到的话在 new 一个新的
      current = new SupportRequestManagerFragment();
      current.setParentFragmentHint(parentHint);
      if (isParentVisible) {
        current.getGlideLifecycle().onStart();
      }
      // 然后暂时缓存到 pendingSupportRequestManagerFragments 中
      pendingSupportRequestManagerFragments.put(fm, current);
      fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
      // 等到被 fm 添加后再移除
      handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
    }
  }
  return current;
}

supportFragmentGet() 方法主要是为了获取 FragmentManager fm 对应的 requestManager。而 requestManager 是被存储经由 fm 添加的 SupportRequestManagerFragment 中的。

因此首先根据 fm 来获取对应的 SupportRequestManagerFragment。而具体的逻辑是在 getSupportRequestManagerFragment() 中实现的。

在 getSupportRequestManagerFragment() 中会先根据 TAG 从 fm 中去获取对应的 SupportRequestManagerFragment 实例。如果还没有被添加,会先 new 一个新的并添加。

注意一个细节,在 getSupportRequestManagerFragment() 中,会先从 pendingSupportRequestManagerFragments 中去获取目标 SupportRequestManagerFragment,如果没有才会 new 一个新的,然后又会先缓存到 pendingSupportRequestManagerFragments 中,等到被 fm 添加之后,才会通过 handler发送 msg 去移除。这里的目的应该是为了防止被 fm 重复添加。

然后再回到 supportFragmentGet() 方法中,当通过 getSupportRequestManagerFragment() 获得对应的 SupportRequestManagerFragment 后,如果其是新 new 的,则此时调用 SupportRequestManagerFragment#getRequestManager() 得到的值就会为 null,因此需要构建一个新的 RequestManager 并设置到 SupportRequestManagerFragment 中。

划重点 :可以看到,在构建 RequestManager 的时候会传入 SupportRequestManagerFragment 的成员变量 lifecycle(具体为 ActivityFragmentLifecycle 类型)。

// RequestManager 的构造方法
RequestManager(
    Glide glide,
    Lifecycle lifecycle,
    RequestManagerTreeNode treeNode,
    RequestTracker requestTracker,
    ConnectivityMonitorFactory factory,
    Context context) {
  ...
  connectivityMonitor =
      factory.build(
          context.getApplicationContext(),
          new RequestManagerConnectivityListener(requestTracker));
          
  // addSelfToLifecycle 实现在主线程中调用 lifecycle.addListener(this);
  if (Util.isOnBackgroundThread()) {
    mainHandler.post(addSelfToLifecycle);
  } else {
    lifecycle.addListener(this);
  }
  lifecycle.addListener(connectivityMonitor);
  ...
}

然后在 RequestManager 的构造方法中(即构建它的时候),会将自身添加到 ActivityFragmentLifecycle 的 lifecycleListeners 集合中。以及会将 connectivityMonitor 也添加进去。

这样做的目的就是为了与 SupportRequestManagerFragment 的生命周期实现关联。(具体的原理在后文)

而且,需要知道的是,RequestManager 与 SupportRequestManagerFragment 是一一对应的关系,因此,尽管在一个业务 Activity 中,可能会存在多次调用 Glide 来加载图片,但是只会存在一个 RequestManager,只不过多次调用会产生多个 Request,而该 Request 则是被添加到 RequestManager 来进行管理。


对于上面的内容,主要就是说明通过 ActivityFragmentLifecycle,将 SupportRequestManagerFragment和 RequestManager 建立了联系。

然后回到 SupportRequestManagerFragment 自身的实现,看到其生命周期方法:

// SupportRequestManagerFragment.java

public void onStart() {
  super.onStart();
  lifecycle.onStart();
}

public void onStop() {
  super.onStop();
  lifecycle.onStop();
}

public void onDestroy() {
  super.onDestroy();
  lifecycle.onDestroy();
  unregisterFragmentWithRoot();
}

可以看到,不同的生命周期方法又会调用 lifecycle 对应的方法,而 lifecycle 就是前面说的 ActivityFragmentLifecycle。

public SupportRequestManagerFragment() {
  this(new ActivityFragmentLifecycle());
}

public SupportRequestManagerFragment(@NonNull ActivityFragmentLifecycle lifecycle) {
  this.lifecycle = lifecycle;
}

而对于 ActivityFragmentLifecycle 有:

void onStart() {
  isStarted = true;
  for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
    lifecycleListener.onStart();
  }
}
void onStop() {
  isStarted = false;
  for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
    lifecycleListener.onStop();
  }
}
void onDestroy() {
  isDestroyed = true;
  for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
    lifecycleListener.onDestroy();
  }
}

lifecycleListeners 即 Set<LifecycleListener>,其包含的元素就是在前面提到的 RequestManager 的构造方法中添加的,包括 RequestManager 自身,以及 RequestManager#connectivityMonitor。

然后会在 ActivityFragmentLifecycle 对应的方法中回调 lifecycleListeners 中元素的对应的方法。(其中 Util.getSnapshot() 的目的是为了一个副本,防止对 lifecycleListeners 造成修改)


然后就是看 RequestManager 以及 RequestManager#connectivityMonitor 对应的实现了。

(1)对于 RequestManager

// RequestManager.java
public synchronized void onStart() {
  resumeRequests();
  targetTracker.onStart();
}

public synchronized void onStop() {
  // 暂停管理的 requests
  // 对应的暂停的逻辑大致就是释放与 requst 相关的资源,以及移除相关的回调
  pauseRequests();
  targetTracker.onStop();
}
 
public synchronized void onDestroy() {
  targetTracker.onDestroy();
  for (Target<?> target : targetTracker.getAll()) {
    clear(target);
  }
  targetTracker.clear();
  requestTracker.clearRequests();
  lifecycle.removeListener(this);
  lifecycle.removeListener(connectivityMonitor);
  mainHandler.removeCallbacks(addSelfToLifecycle);
  glide.unregisterRequestManager(this);
}

public synchronized void resumeRequests() {
  requestTracker.resumeRequests();
}

targetTracker 即 TargetTracker,还记得在 Glide.with(activity).load("").into(view) 这一
流程中,在 into() 方法中就会调用 RequestManager#track() 来开启资源的加载。

// RequestManager.java
synchronized void track(@NonNull Target<?> target, @NonNull Request request) {
  targetTracker.track(target);
  requestTracker.runRequest(request);
}

在该方法中,就会把传递进来的 Target(如 DrawableImageViewTarget) 添加到 targetTracker 中,把传递进来的 Request 添加到 requestTracker 中并开启 Request。

比如 RequestManager#onStart() 方法,会通过 requestTracker.resumeRequests() 恢复内部管理的未完成的或者失败的 Request。

// RequestTracker.java

/**
 * Starts any not yet completed or failed requests.
 */
public void resumeRequests() {
  isPaused = false;
  for (Request request : Util.getSnapshot(requests)) {
    if (!request.isComplete() && !request.isRunning()) {
      // 开启 request
      request.begin();
    }
  }
  pendingRequests.clear();
}

以及调用 targetTracker.onStart() 来回调 targetTracker 内部管理的 Targer 实例的 onStrat() 方法。

(2)对于 RequestManager#connectivityMonitor

首先需要知道 connectivityMonitor 是什么。前面有提到 RequestManager 的构造方法,其就是在里面被实例化的。

connectivityMonitor =
        factory.build(
            context.getApplicationContext(),
            new RequestManagerConnectivityListener(requestTracker));

其中 factory 默认为 DefaultConnectivityMonitorFactory。因此:

// DefaultConnectivityMonitorFactory.java
public ConnectivityMonitor build(
    @NonNull Context context,
    @NonNull ConnectivityMonitor.ConnectivityListener listener) {
  int permissionResult = ContextCompat.checkSelfPermission(context, NETWORK_PERMISSION);
  boolean hasPermission = permissionResult == PackageManager.PERMISSION_GRANTED;
  if (Log.isLoggable(TAG, Log.DEBUG)) {
    Log.d(
        TAG,
        hasPermission
            ? "ACCESS_NETWORK_STATE permission granted, registering connectivity monitor"
            : "ACCESS_NETWORK_STATE permission missing, cannot register connectivity monitor");
  }
  return hasPermission
      ? new DefaultConnectivityMonitor(context, listener) : new NullConnectivityMonitor();
}

如果有网络权限,则 RequestManager#connectivityMonitor 默认为 DefaultConnectivityMonitor。

因此对于 DefaultConnectivityMonitor#onStart() 有:

// DefaultConnectivityMonitor.java
public void onStart() {
  register();
}

private void register() {
  if (isRegistered) {
    return;
  }
  // Initialize isConnected.
  isConnected = isConnected(context);
  try {
    // See #1405
    context.registerReceiver(connectivityReceiver,
        new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    isRegistered = true;
  } catch (SecurityException e) {
    // See #1417, registering the receiver can throw SecurityException.
    if (Log.isLoggable(TAG, Log.WARN)) {
      Log.w(TAG, "Failed to register", e);
    }
  }
}

public void onStop() {
  unregister();
}

public void onDestroy() {
  // Do nothing.
}

可以看到,DefaultConnectivityMonitor 是用于监听网络连接变化的。准确的说,会监听 ConnectivityManager.CONNECTIVITY_ACTION 这一广播。当回调 DefaultConnectivityMonitor#onStart() 时,就会重新注册对于广播的监听。

onStop() 则相反。

补充:

而当网络连接发生变化时,接收到广播之后回调用 DefaultConnectivityMonitor#listener.onConnectivityChanged(),而 listener 即为 RequestManagerConnectivityListener。

// RequestManagerConnectivityListener.java
public void onConnectivityChanged(boolean isConnected) {
  if (isConnected) {
    synchronized (RequestManager.this) {
      requestTracker.restartRequests();
    }
  }
}

requestTracker 就是 RequestManagerConnectivityListener 在实例化的时候传递进去的 RequestManager#requestTracker。

// RequestTracker.java
public void restartRequests() {
  for (Request request : Util.getSnapshot(requests)) {
    if (!request.isComplete() && !request.isCleared()) {
      request.clear();
      if (!isPaused) {
        request.begin();
      } else {
        // Ensure the request will be restarted in onResume.
        pendingRequests.add(request);
      }
    }
  }
}

因此最终的目的就是在 SupportRequestManagerFragment 生命周期内,监听网络连接的变化,从而在网络连接正常的情况下能够重新开始 request。


最后的总结,Glide 对于生命周期的管理,简单说就是监听业务层的 Activity 或者 Fragment,在对应的生命周期,实现对于资源加载请求(即 Request)的开启或者暂停。


参考文章:如何绑定页面生命周期(一)-Glide实现

Android高级面试核心考点与性能优化实战解析 在移动开发领域,Android系统机制与性能优化是工程师必须掌握的核心技术。从底层原理来看,Handler机制通过消息队列实现线程间通信,其链表结构设计确保了高频消息处理效率;Binder IPC则利用内存映射技术实现跨进程通信,相比Socket显著提升传输性能。这些机制在UI渲染、进程通信等场景中具有重要技术价值,例如通过同步屏障优化帧率稳定性,或采用分块传输解决大图卡顿问题。结合热词Handler和Binder,本文深入解析了高级面试中的系统原理类问题,并分享了内存泄漏检测、组件化通信等实战优化方案,为 阅读详情

相关推荐

Android相关面试题

一.SharedPreferences是线程安全的吗?它的commit()方法和apply()方法有什么区别?它有什么缺点?有没有类似更好的方案? 1.SharePreferences是线程安全的 里面的方法有大量的synchronized来保障。 2.SharePreferences不是进程安全的 即使你用了MODE_MULTI_PROCESS 。 3.第一次getSharePreference会读取磁盘文件,异步读取,写入到内存中,后续的getSharePreference都是从内存中拿了。 4.第一

龚礼鹏的博客 4280

Glide源码流程分析

1. 时序图 2. 时序图中一些关键步骤中的解析说明: Glide.with 将当前显示的页面对象传入Glide SupportRequestManagerFragment 空的fragment 监听当前页面的生命周期 ActivityFragmentLifecycle 观察者模式,fragment的生命周期交给了他 Request previous = target.getRequest(); if(previous != null) { 判断当前的ImageView是否存在了请

xuyin1204的博客 520

Blender入门教程-3D视图界面介绍

3D视图用于与3D场景交互,可用于各种目的,例如建模、动画、纹理绘制等。在关闭 启动画面 后,启动场景会显示在3D视口中(如果没有加载其他blend文件)。01 标题栏标题栏包含了基于当前 模式 的各种菜单和控制。

weixin_52345129的博客 2287

Glide(一)生命周期的监听

Glide对生命周期的监听

qq_41095045的博客 1405

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

Halcon一维测量实战:从measure_pos与measure_pairs的底层原理到精准应用

本文深入解析Halcon中measure_pos与measure_pairs算子的底层原理与精准应用,涵盖参数调优、测量矩形方向设置及典型工业场景实战。通过对比分析,揭示两者在一维测量中的核心差异与适用场景,提供从基础到高级的完整解决方案,助力工业视觉检测精度提升。

weixin_42525551的博客 422

android 对glide封装,Android Glide浅析

目前在android项目上,图片加载库有很多选择,Glide是主流的加载库之一,作为一个被google推荐的开源库,它有着跟随页面周期、支持gif和webp、支持多种数据源等特点,并且使用起来很简单,本篇文章将会分析Glide的加载流程,但是Glide的源码比较复杂,我将从Glide的最简单使用分析Glide是如何去加载一张图片的。(一)从Glide.with(context)入手Glide.wi...

weixin_39922374的博客 523

DDS(Direct Digital Synthesizer)数字频率合成器

随着数字技术在仪器仪表和通信系统中的广泛使用,可从参考频率源产生多个频率的数 字控制方法诞生了,即直接数字频率合成(DDS)。 直接数字合成(DDS)是一种产生模拟波形(通常是正弦波)的方法,它通过产生数字形式的时变信号,然后进行数模转换。由于DDS设备内的操作主要是数字的,它可以提供输出频率之间的快速切换,良好的频率分辨率,并在广泛的频率频谱上操作。随着设计和工艺技术的进步,今天的DDS设备非常紧凑,功耗很小。 上面是比较书面的语言,其实简单地说就是一个信号发生器模块,主要是产生频率可调的三角波正弦波。

denghuajing的博客 4863

Glide使用简介及流程分析

转载地址:http://www.jianshu.com/p/7125feef0ddf Glide简介 Glide是Google推荐的一套快速高效的图片加载框架,作者是bumptech,功能强大且使用方便,实际的android应用开发中,有不少的开发者在使用它,今天,老衲就带大家来讲解下Glide的使用及实现的逻辑流程。 Glide的使用 Glide的使用与前一篇的Picasso类似,

l_215851356的专栏 652

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2782

MaaS 商业模式全面分析报告:从技术赋能到商业变现的全链条探索

MaaS(模型即服务)商业模式正成为AI产业主流,2024年上半年中国市场规模达2.5亿元,预计2027年占比将提升至47%。该模式通过云服务提供预训练AI模型,大幅降低企业应用AI的技术门槛和成本。核心盈利方式包括按使用量计费、订阅制、定制化服务等,其中混合模式因灵活性成为趋势。MaaS产业链包含模型提供商、云平台、应用开发商和最终用户,重塑了AI产业格局。随着《数据法案》等监管加强,数据增值服务面临更严格合规要求。未来五年,中国MaaS市场增速预计超50%,用户规模将从2025年2.1亿增至2030年5

芯片行业20年 · 参与定义实现千万级量产出货 · AI芯片PM 2888

Glide框架解析---生命周期的介绍(四)

上一篇博客中我们主要介绍了Glide调用的流程,涉及的类还有方法我在交互图中做了详细的介绍,这篇呢我们来介绍一下Glide的生命周期。本来我打算在博客中详细的写出每个类和每个过程,但是涉及的篇幅实在的太多了,所以之后的博客还是以思想为主,具体的源代码我会直接提供出来,当然有不懂的地方可以随时留言提问。 1.生命周期的监控 Glide是如何实现载体生命周期的监控的呢?其实思想和简单,就是在载体(...

qq_32019367的博客 496

CANape a2l文件的编辑教程

编辑a2l文件

wsq119的博客 1万+

【笔记整理】Glide 4.9.0 执行流程源码解析

对于源码的分析,是基于 Glide 最简单的使用的流程进行的: Glide.with(MainActivity.this).load("url of image resource").into(view); 1. with() 方法 with() 方法会传入当前 activity、fragment 等,目的就是为了获取对应的 context,然后根据该 context 来得到 RequestMa...

一个有思想的搬运工 595

GEE:变异系数法在遥感影像分析中的应用及权重计算

本文介绍了在Google Earth Engine(GEE)平台上基于变异系数法的多指标加权遥感影像分析方法。该方法通过计算每个指标的平均值和标准差,进而计算变异系数来评估指标的变化程度。利用变异系数,我们可以计算每个指标的权重,并将其应用于加权和指数的计算,从而提高遥感影像分析的准确性和可靠性。方法应用于计算Risk-Screening Environmental Indicators (RSEI),并以此为例。

养乐多的博客 2270

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Glide图片加载的使用整理

这里只整理使用方法,方便自己使用,想看详细的解析请转阅 作者:MrTrying 链接:https://www.jianshu.com/p/7ce7b02988a4 來源:简书 作者:Jiun俊 链接:https://www.jianshu.com/p/e8c204a29623 來源:简书 非常感谢作者的分享! 一.基本方法 String url = "http://img1.dzww...

fong_simon的博客 6597

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Glide源码分析

本文将尝试梳理Glide 3.7.0版本常用方法的源码实现,关于Glide的使用方法网上已经有足够多的资料可供查阅,因此本文默认阅读者对于Glide的使用方法已无障碍。第一次尝试将自己的学习结果整理成文字,有不足之处和建议请多多指出。

xmt328的博客 315

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

整理Glide方法使用含义(毛玻璃效果,实现圆角等)

现在项目中一般使用Glide进行图片加载,于是找一下他的各个方法的使用,方便使用而已。添加依赖: compile 'com.github.bumptech.glide:glide:3.7.0'基本使用:Glide .with(this) .load(url) .into(imageView);强大的Glide.with() with(Context context).

黄孝果的博客 5486

Android-Glide使用

图片加载很是重要,我也对比过别的库,觉得还是Glide好用,我只是简单的分享下我开发用到的相关知识,整理下项目相关的库,废话不多说,直接开始吧 Glide的配置配置很简单,只要在Module的Gradle添加依赖即可compile 'com.github.bumptech.glide:glide:3.7.0' compile 'com.android.support:support-v4:25.3.

Li_Qing_Xue的博客 6623

Android基础面试题整理

1、第三方库源码分析 1.1 OkHttp OkHttp内部逻辑流程图: 先来一发灵魂拷问四连击: addInterceptor与addNetworkInterceptor有什么区别? 网络缓存如何实现的? 网络连接怎么实现复用? OkHttp如何做网络监控? 1.1.1 OkHttp基本实现原理(责任链) OkHttp的内部实现通过一个责任链模式完成,将网络请求的各个阶段封装到各个链条中,实现了各层的解耦。 1.1.2 OkHttp源码分析 OkHttp源码分析 核心类: OkHttpClient

单片机菜鸟哥的博客 1769

Android常用第三方框架整理

缓存 DiskLruCache LRU(Least Recently Used),即近期最少使用算法。 使用缓存策略, 对网络上下载的图片等资源文件进行缓存, 当再次请求同一个资源url时, 首先从缓存中查找是否存在, 当不存在时再从网络上下载。 采用缓存, 除了提高获取资源的速度, 也对减少使用用户手机上的流量有很好的作用. 核心思想是当缓存满时,会优先淘汰那些最少使用的缓存对象。 采用...

weixin_39027589的博客 1009

Android校招笔试题三复盘:从基础到架构的实战解析

Android开发面试中,除了基础语法和框架API,面试官更看重候选人对性能优化、自定义View、Handler通信机制等核心原理的深度理解。从HashMap线程安全到主线程Looper的epoll机制,从MeasureSpec的wrap_content陷阱到事件分发中的滑动冲突,这些知识点不仅出现在笔试中,更是日常开发中定位问题、提升体验的关键技术。深入掌握ANR监控、内存泄漏排查、图片加载缓存等实战技能,能帮助开发者在真实业务场景中构建流畅稳定的应用。本文基于一套强调工程决策能力的校招笔试题,逐题拆解其

weixin_30367873的博客 597

2017年欢聚时代Android校招笔试题型深度复盘

Android开发进阶不仅要求掌握四大组件的使用,更需要对底层原理有系统认知。例如,Binder作为Android IPC的核心机制,通过mmap实现一次拷贝,保障跨进程通信的性能与安全;Handler消息机制则通过Looper与MessageQueue驱动主线程任务调度。性能优化中的内存泄漏、布局绘制等问题,直接影响应用用户体验。这些知识点在移动互联网时代成为Android工程师校招笔试的高频考点。本文基于欢聚时代2017年Android校招笔试A卷,复盘其题型结构与考察重点,涵盖Java基础、并发、四大

weixin_34248023的博客 442
上一篇: 【笔记整理】Glide 4.9.0 的缓存机制
下一篇: 【笔记整理】Glide 4.9.0 关于数据加载之后的回调过程
OneDeveloper
博客等级 码龄9年 61粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值