Use multiple threads for refreshing feeds (#7126)

This commit is contained in:
0x082c8bf1 2024-04-27 03:44:09 -05:00 committed by GitHub
parent d9d48674ed
commit f69822582d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 43 additions and 22 deletions

View File

@ -12,6 +12,7 @@ import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.work.ForegroundInfo;
import androidx.work.WorkManager;
import java.util.concurrent.TimeUnit;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import com.google.common.util.concurrent.Futures;
@ -39,6 +40,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FeedUpdateWorker extends Worker {
private static final String TAG = "FeedUpdateWorker";
@ -127,6 +130,13 @@ public class FeedUpdateWorker extends Worker {
.build();
}
private void updateNotification(List<Feed> toUpdate) {
if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.POST_NOTIFICATIONS)
== PackageManager.PERMISSION_GRANTED) {
notificationManager.notify(R.id.notification_updating_feeds, createNotification(toUpdate));
}
}
@NonNull
@Override
public ListenableFuture getForegroundInfoAsync() {
@ -134,29 +144,40 @@ public class FeedUpdateWorker extends Worker {
}
private void refreshFeeds(List<Feed> toUpdate, boolean force) {
while (!toUpdate.isEmpty()) {
if (isStopped()) {
return;
}
if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.POST_NOTIFICATIONS)
== PackageManager.PERMISSION_GRANTED) {
notificationManager.notify(R.id.notification_updating_feeds, createNotification(toUpdate));
}
Feed feed = toUpdate.get(0);
try {
if (feed.isLocalFeed()) {
LocalFeedUpdater.updateFeed(feed, getApplicationContext(), null);
} else {
refreshFeed(feed, force);
List<Feed> notificationRemainingFeeds = new ArrayList<>(toUpdate);
updateNotification(notificationRemainingFeeds);
ExecutorService executor = Executors.newFixedThreadPool(4);
for (Feed feed : toUpdate) {
executor.submit(() -> {
if (isStopped()) {
return;
}
} catch (Exception e) {
DBWriter.setFeedLastUpdateFailed(feed.getId(), true);
DownloadResult status = new DownloadResult(feed.getTitle(),
feed.getId(), Feed.FEEDFILETYPE_FEED, false,
DownloadError.ERROR_IO_ERROR, e.getMessage());
DBWriter.addDownloadStatus(status);
}
toUpdate.remove(0);
try {
if (feed.isLocalFeed()) {
LocalFeedUpdater.updateFeed(feed, getApplicationContext(), null);
} else {
refreshFeed(feed, force);
}
} catch (Exception e) {
DBWriter.setFeedLastUpdateFailed(feed.getId(), true);
DownloadResult status = new DownloadResult(feed.getTitle(),
feed.getId(), Feed.FEEDFILETYPE_FEED, false,
DownloadError.ERROR_IO_ERROR, e.getMessage());
DBWriter.addDownloadStatus(status);
}
synchronized (notificationRemainingFeeds) {
notificationRemainingFeeds.remove(feed);
if (!notificationRemainingFeeds.isEmpty()) {
updateNotification(notificationRemainingFeeds);
}
}
});
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
//~300 years have elapsed
}
}