From 460b77ea0a5b6867b9efd5371276a62fd5ae68ba Mon Sep 17 00:00:00 2001 From: daniel oeh Date: Wed, 1 Aug 2012 11:56:14 +0200 Subject: Improved stability when DownloadObserver changes it's content --- .../antennapod/asynctask/DownloadObserver.java | 36 ++++++++++++++++------ 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/de/danoeh/antennapod/asynctask/DownloadObserver.java b/src/de/danoeh/antennapod/asynctask/DownloadObserver.java index 9da0ad90c..08353add7 100644 --- a/src/de/danoeh/antennapod/asynctask/DownloadObserver.java +++ b/src/de/danoeh/antennapod/asynctask/DownloadObserver.java @@ -3,11 +3,13 @@ package de.danoeh.antennapod.asynctask; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import android.app.DownloadManager; import android.content.Context; import android.database.Cursor; import android.os.AsyncTask; +import android.os.Handler; import android.util.Log; import de.danoeh.antennapod.feed.FeedFile; import de.danoeh.antennapod.storage.DownloadRequester; @@ -31,16 +33,18 @@ public class DownloadObserver extends AsyncTask { private DownloadRequester requester; private Context context; - private ArrayList statusList; + private List statusList; private List observer; + private Handler contentChanger; public DownloadObserver(Context context) { super(); this.context = context; requester = DownloadRequester.getInstance(); - statusList = new ArrayList(); + statusList = new CopyOnWriteArrayList(); observer = Collections .synchronizedList(new ArrayList()); + contentChanger = new Handler(); } @Override @@ -88,7 +92,7 @@ public class DownloadObserver extends AsyncTask { } private void refreshStatuslist() { - ArrayList unhandledItems = new ArrayList( + final ArrayList unhandledItems = new ArrayList( statusList); Cursor cursor = getDownloadCursor(); @@ -102,7 +106,14 @@ public class DownloadObserver extends AsyncTask { if (status == null) { status = new DownloadStatus(feedFile); - statusList.add(status); + final DownloadStatus statusToAdd = status; + contentChanger.post(new Runnable() { + @Override + public void run() { + statusList.add(statusToAdd); + publishProgress(); + } + }); } else { unhandledItems.remove(status); } @@ -138,11 +149,18 @@ public class DownloadObserver extends AsyncTask { } while (cursor.moveToNext()); } cursor.close(); + contentChanger.post(new Runnable() { + + @Override + public void run() { + // remove unhandled items from statuslist + for (DownloadStatus status : unhandledItems) { + statusList.remove(status); + } + publishProgress(); + } + }); - // remove unhandled items from statuslist - for (DownloadStatus status : unhandledItems) { - statusList.remove(status); - } } /** Request a cursor with all running Feedfile downloads */ @@ -195,7 +213,7 @@ public class DownloadObserver extends AsyncTask { return null; } - public ArrayList getStatusList() { + public List getStatusList() { return statusList; } -- cgit v1.2.3