簡體   English   中英

等待Android中待處理的AsyncTask

[英]Wait for pending AsyncTask in android

我的應用程序中有一個ListView ,該ListView每一行都需要從遠程資源中加載多個圖像。(即listview看起來像Instagram,其中每個項目至少包含一個圖像)。

我正在實現兩級緩存以改善負載映像體驗:

  1. 我的一級內存緩存的定義如下:

    private Map<String, SoftReference<Bitmap>> l1ImageCache = new HashMap<String, SoftReference<Bitmap>>();
    我可以在內存中保留圖像的一些SoftReference,以使應用程序查找更快。

  2. 我的二級文件緩存是SD卡或手機存儲上的文件夾。 我在其中保存一些已經下載的圖像的位置。 如果應用程序在內存緩存中找不到圖像,它將在文件目錄中查找。 如果映像文件存在,它將在本地加載文件,並將文件引用也放入內存緩存。

  3. 如果該應用程序無法從內存緩存或文件緩存中找到所需的圖像,它將使用ImageDownloadWorker (擴展AsyncTask )啟動線程並下載圖像。 但是,Android每個應用程序最多只能允許128個線程,我正在考慮一種節省一些線程的方法。 我創建了這個數據結構:

    // keep all pending downloads
    private HashMap<String, ImageDownloadWorker> downloadTaskMap = new HashMap<String, ImageDownloadWorker>();
    其中的String字段將是要下載的URL。 這是為了檢查下載特定URL的線程是否已在運行,因此我不必啟動另一個線程來下載相同的內容。

我的問題是根據代碼,假設一種情況是應用程序將要下載圖像。 該映像既不在內存高速緩存中也不在已下載的文件文件夾中退出。 因此,應用程序檢查了downloadTaskMap是否已經有一個線程下載該文件,因此不必為同一件事創建新的AsyncTask。 但是,如何在不阻塞主線程的情況下知道此待完成的下載任務何時完成? 如果我執行等待/通知或無限的while循環之類的操作,我想知道這是否會阻塞UI線程?

指針歡迎,謝謝!

首先,您不需要自己編寫所有內容,有許多解決方案可用於Android的圖像延遲加載。 在這里看 ,或者在這里過得更好。

至於異步任務-它們不會同時運行,您應該使用普通ThreadexecuteOnExecutor作為此答案的最新更新(否則,您將不會在較新的設備上獲得並行性)。 順便說一句,我認為您會發現該答案的作用遠不止一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM