首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 雙線程協作截圖發送:生產者-消費者模式 + 阻塞隊列實現

     編輯:程式設計疑難解答

架構設計

**截圖線程(生產者)** → **阻塞隊列** → **發送線程(消費者)**。

核心組件

  • 隊列:`BlockingQueue` 或 `BlockingQueue` (文件路徑),容量限制防 OOM。
  • 截圖線程:循環 `queue.put(captureScreen())`,隊列滿自動阻塞。
  • 發送線程:循環 `Bitmap bmp = queue.take(); sendViaSocket(bmp);`,隊列空自動阻塞。
  • 動態休眠:根據設備性能、網速調整截圖/發送間隔,避免隊列長期滿/空導致卡幀。

代碼骨架

BlockingQueue queue = new LinkedBlockingQueue<>(10); // 緩衝 10 幀

// 截圖線程
new Thread(() -> {
    while (running) {
        Bitmap bmp = captureScreen(); // 需權限/媒體投影
        try { queue.put(bmp); } catch (InterruptedException e) { break; }
        Thread.sleep(captureIntervalMs);
    }
}).start();

// 發送線程
new Thread(() -> {
    while (running) {
        try {
            Bitmap bmp = queue.take();
            sendViaSocket(bmp);
            bmp.recycle(); // 及時回收內存
        } catch (InterruptedException | IOException e) { break; }
        Thread.sleep(sendIntervalMs);
    }
}).start();

關鍵細節

  • 全屏截圖需 Root/媒體投影 API(`MediaProjection`),應用內截圖無需權限。
  • Bitmap 復用:用 `inBitmap` 或對象池減少 GC。
  • 網絡異常處理:重試、斷點續傳、心跳檢測。
  • 生命周期管理:`running` 标志位、`Thread.interrupt()` 優雅停止。

總結

生產者-消費者 + 阻塞隊列是雙線程協作經典模式,解耦生產消費速度差異,配合動態節流實現流暢截圖推流。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved