当前位置: 首页 > news >正文

旅游公司网站建设百度指数分析大数据

旅游公司网站建设,百度指数分析大数据,西地那非片的功效和副作用,太白 网站建设一、Handler 核心机制源码解析 真题 1:post vs postDelayed 源码差异 题目描述: 分析 post 和 postDelayed 的底层实现差异,为什么说它们本质是同一个方法? 源码级回答: 两者底层均通过 sendMessageDelayed 实现&am…

一、Handler 核心机制源码解析

真题 1:post vs postDelayed 源码差异

题目描述
分析 post 和 postDelayed 的底层实现差异,为什么说它们本质是同一个方法?

源码级回答
两者底层均通过 sendMessageDelayed 实现,唯一区别在于延迟时间参数:

// Handler.java
public final boolean post(Runnable r) {return sendMessageDelayed(getPostMessage(r), 0); // 延迟0ms
}public final boolean postDelayed(Runnable r, long delayMillis) {return sendMessageDelayed(getPostMessage(r), delayMillis); // 自定义延迟
}private static Message getPostMessage(Runnable r) {Message m = Message.obtain();m.callback = r; // 将Runnable封装到Message的callback字段return m;
}

核心差异点

  1. 消息入队时机
    • post:消息直接进入队列头部(延迟 0ms),但需等待当前正在处理的消息完成。
    • postDelayed:消息按延迟时间排序插入队列,Looper 在指定时间后处理。
  2. 源码共性
    • 均调用 enqueueMessage 将消息加入 MessageQueue,最终由 Looper 循环调度。
    • 若队列中已有相同 target 和 callback 的消息,会被新消息覆盖(通过 removeCallbacks 实现)。

面试官追问

  • :如果同时调用 post 和 postDelayed(..., 0),哪个先执行?
  • postDelayed(..., 0) 可能后执行。因为 post 直接调用 sendMessageAtFrontOfQueue,会将消息插入队列头部;而 postDelayed(..., 0) 等价于 sendMessageDelayed(..., 0),实际调用 sendMessageAtTime,会根据当前时间计算执行点,可能插入队列非头部位置。

二、延迟消息引发的内存泄漏

真题 2: 退出 Activity 后延迟消息导致的泄漏

题目描述
在 Activity 中使用 postDelayed 发送一个 10 分钟的延迟消息,退出 Activity 后会发生什么?如何解决?

风险分析

  1. 引用链关系
    MessageQueue → Message → Handler → Activity
    非静态 Handler 隐式持有 Activity 引用,导致 Activity 无法被 GC 回收。
  2. 生命周期冲突
    Activity 已销毁,但 MessageQueue 仍持有未处理的消息。

解决方案

  1. 静态内部类 + 弱引用
public class MainActivity extends AppCompatActivity {private static class SafeHandler extends Handler {private final WeakReference<MainActivity> activityRef;public SafeHandler(MainActivity activity) {activityRef = new WeakReference<>(activity);}@Overridepublic void handleMessage(Message msg) {MainActivity activity = activityRef.get();if (activity != null) {// 安全操作Activity}}}private final SafeHandler mHandler = new SafeHandler(this);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mHandler.postDelayed(() -> {// 延迟任务}, 10 * 60 * 1000); // 10分钟}@Overrideprotected void onDestroy() {super.onDestroy();mHandler.removeCallbacksAndMessages(null); // 双重保障}
}
  1. 生命周期感知组件(LiveData/ViewModel)
public class MyViewModel extends ViewModel {private final MutableLiveData<String> mData = new MutableLiveData<>();public void fetchData() {// 使用协程替代HandlerviewModelScope.launch {delay(10 * 60 * 1000) // 模拟延迟mData.value = "Result"}}
}

三、消息队列阻塞与性能优化

真题 3: 主线程 Handler 阻塞导致 ANR

题目描述
在主线程 Handler 中执行耗时操作,对应用有什么影响?如何避免?

源码级分析

  1. Looper 阻塞原理
    // Looper.java
    public static void loop() {for (;;) {Message msg = queue.next(); // 可能阻塞if (msg == null) return;msg.target.dispatchMessage(msg); // 执行Handler回调msg.recycleUnchecked();}
    }
    

    若 handleMessage 执行耗时操作(如 IO、网络),会导致 queue.next() 无法获取下一条消息,造成主线程卡顿。

解决方案

  1. 任务分类处理
    • UI 操作:在主线程 Handler 中执行,避免耗时操作。
    • 耗时任务:使用 HandlerThread、IntentService 或线程池处理,结果通过主线程 Handler 回调。
    // 使用HandlerThread处理耗时任务
    private HandlerThread mHandlerThread;
    private Handler mWorkerHandler;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mHandlerThread = new HandlerThread("WorkerThread");mHandlerThread.start();mWorkerHandler = new Handler(mHandlerThread.getLooper());mWorkerHandler.post(() -> {// 执行耗时操作final String result = doHeavyWork();runOnUiThread(() -> updateUI(result)); // 切回主线程});
    }
    
  2. 使用异步 Handler
    // 创建异步Handler,避免ANR
    Handler asyncHandler = new Handler(Looper.getMainLooper(), callback, true);
    

    通过 async 参数标记为异步消息,在 Choreographer 同步屏障期间仍可执行。

四、HandlerThread 与线程池的选择

真题 4: 图片下载场景的线程方案

题目描述
在图片浏览场景中,需要下载并显示多张图片,选择 HandlerThread 还是线程池?为什么?

对比分析

特性HandlerThread线程池(FixedThreadPool)
任务执行方式单线程顺序执行多线程并发执行
线程创建开销仅 1 个线程,开销小多个线程,开销大
适用场景顺序执行的轻量级任务(如日志)并发执行的耗时任务(如图像)
内存占用高(线程数量多)

最佳实践

// 线程池方案(更适合图片下载)
private ExecutorService mExecutor = Executors.newFixedThreadPool(3);
private Handler mMainHandler = new Handler(Looper.getMainLooper());public void downloadImage(String url) {mExecutor.execute(() -> {Bitmap bitmap = downloadBitmap(url);mMainHandler.post(() -> imageView.setImageBitmap(bitmap));});
}

选择理由

  • 图片下载是 IO 密集型任务,并发执行可显著提升效率。
  • 线程池可控制最大线程数,避免 OOM;而 HandlerThread 是单线程,无法利用多核 CPU。

五、高级替代方案

真题 5: LiveData vs Handler

题目描述
如何使用 LiveData 完全替代 Handler,解决内存泄漏问题?

LiveData 方案

public class ImageViewModel extends ViewModel {private final MutableLiveData<Bitmap> mImageData = new MutableLiveData<>();public LiveData<Bitmap> getImageData() {return mImageData;}public void loadImage(String url) {// 使用协程或线程池执行异步任务viewModelScope.launch(Dispatchers.IO) {Bitmap bitmap = downloadBitmap(url);mImageData.postValue(bitmap); // 自动切换到主线程}}
}public class ImageActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ImageViewModel viewModel = new ViewModelProvider(this).get(ImageViewModel.class);// 自动绑定Activity生命周期,无需手动移除viewModel.getImageData().observe(this, bitmap -> {imageView.setImageBitmap(bitmap);});viewModel.loadImage("https://example.com/image.jpg");}
}

优势

  1. 自动生命周期管理:Observer 自动在 Activity 销毁时解除订阅。
  2. 线程安全postValue 自动切换到主线程,无需额外 Handler。
  3. 数据一致性:配置变更(如旋转屏幕)时自动恢复最新数据。

六、内存泄漏检测实战

真题 6:字节跳动面试 - 如何定位 Handler 泄漏

题目描述
APP 频繁出现内存泄漏,怀疑与 Handler 有关,如何快速定位?

排查步骤

  1. LeakCanary 检测

    public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();if (BuildConfig.DEBUG) {LeakCanary.install(this);}}
    }
    
     

    当检测到泄漏时,LeakCanary 会生成引用链报告,例如:
    MainActivity$1Handler → MainActivity

  2. Profiler 内存分析

    • 触发泄漏场景(如旋转屏幕)。
    • 抓取堆转储文件,搜索 Handler 实例。
    • 查看 MessageQueue 中待处理的消息,确认是否持有 Activity 引用。
  3. StrictMode 辅助

    if (BuildConfig.DEBUG) {StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedClosableObjects().detectLeakedRegistrationObjects().penaltyLog().build());
    }
    
http://www.cadmedia.cn/news/7079.html

相关文章:

  • 关于二手书的网站开发ppt合肥优化排名推广
  • 优化门户网站建设微信朋友圈营销文案
  • 西安百度网站建设网址注册查询
  • 《网页设计与网站建设》A卷答案长春网站建设方案优化
  • CQ网络科技网站建设全媒体运营师报名费多少钱
  • 做网站可以用新建项目的方式吗hao123主页
  • 成都租车公司网站江门网站建设模板
  • 网站建设论坛快速建站网站网络排名优化方法
  • 教学网站建设 效益网站如何做优化排名
  • html论坛代码大全seo关键词优化如何
  • 网站内容包括哪些营销策划公司经营范围
  • 网站教程网络黄页推广软件哪个好
  • 国发网站建设云南疫情最新消息
  • 在郑州网站建设爱站网关键词查询网站
  • 福田住房和建设局网站seo教程书籍
  • 山东住房城乡建设部网站优化 seo
  • 网络广告一般收费价目表站长工具seo综合查询全面解析
  • 淘宝建设网站常见问题成都网站seo厂家
  • 建筑模板破碎机电商沙盘seo裤子关键词
  • 唐山网站建设报价下载百度极速版免费安装
  • 机关党建网站建设方案网站维护费用一般多少钱
  • 123网址导航百度快速排名优化技术
  • 太仓违章建设举报网站百度极速版下载安装最新版
  • 网站建设word文档南昌seo计费管理
  • 中建西部建设北方有限公司网站核心关键词如何优化
  • 怎样开平台软件站长之家seo综合查询
  • 大连网络建站公司分析做百度推广的公司电话号码
  • 改了网站关键词5000元网站seo推广
  • 精品网站建设哪家公司服务好b2b自动发布信息软件
  • 类似情侣空间的网站开发网络营销推广合作