package com.dh.foundation.observer; import android.app.DownloadManager; import android.database.ContentObserver; import android.database.Cursor; import android.os.Handler; import com.dh.foundation.manager.FoundationManager; import java.util.ArrayList; import java.util.List; /** * 下载改变观察者 * Created By: Seal.Wu * Date: 2015/8/27 * Time: 17:58 */ public class DownloadChangeObserver extends ContentObserver { private Handler handler; private static List<Long> downloadIds = new ArrayList<>(); /** * Creates a content observer. * * @param handler The handler to run {@link #onChange} on, or null if none. */ public DownloadChangeObserver(Handler handler) { super(handler); this.handler = handler; } @Override public void onChange(boolean selfChange) { for (long downloadId : downloadIds) { int[] bytesAndStatus = getBytesAndStatus(downloadId); if (bytesAndStatus[1] != -1) { handler.sendMessage(handler.obtainMessage(downloadIds.indexOf(downloadId), bytesAndStatus[0], bytesAndStatus[1], bytesAndStatus[2])); } } } private int[] getBytesAndStatus(long downloadId) { DownloadManager downloadManager = FoundationManager.getDownloadManager(); int[] bytesAndStatus = new int[]{-1, -1, 0}; DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId); Cursor c = null; try { c = downloadManager.query(query); if (c != null && c.moveToFirst()) { bytesAndStatus[0] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); bytesAndStatus[1] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); bytesAndStatus[2] = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); } } finally { if (c != null) { c.close(); } } return bytesAndStatus; } public static void registerDownloadTask(long downloadId) { downloadIds.add(downloadId); } public static long getDownloadId(int position) { return downloadIds.get(position); } }