Skip to content

Commit 33c5f66

Browse files
Merge pull request #15985 from nextcloud/fix/sort-concurrent-modification-exception
fix(file-sort): concurrent modification exception
2 parents ec57fec + f11226c commit 33c5f66

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.List;
4444
import java.util.Locale;
4545
import java.util.Set;
46+
import java.util.concurrent.ExecutorService;
4647
import java.util.concurrent.Executors;
4748

4849
import androidx.annotation.NonNull;
@@ -67,6 +68,7 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
6768
private Set<File> checkedFiles;
6869
private ViewThemeUtils viewThemeUtils;
6970
private boolean isWithinEncryptedFolder;
71+
private final ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
7072

7173
private static final int VIEWTYPE_ITEM = 0;
7274
private static final int VIEWTYPE_FOOTER = 1;
@@ -372,7 +374,7 @@ public void swapDirectory(final File directory) {
372374
mFiles.clear();
373375
mFilesAll.clear();
374376

375-
Executors.newSingleThreadExecutor().execute(() -> {
377+
singleThreadExecutor.execute(() -> {
376378
// Load first page of folders
377379
List<File> firstPage = FileHelper.INSTANCE.listDirectoryEntries(directory, currentOffset, PAGE_SIZE, true);
378380

@@ -445,12 +447,14 @@ private void notifyItemRange(List<File> updatedList) {
445447
@SuppressLint("NotifyDataSetChanged")
446448
public void setSortOrder(FileSortOrder sortOrder) {
447449
localFileListFragmentInterface.setLoading(true);
448-
final Handler uiHandler = new Handler(Looper.getMainLooper());
449-
Executors.newSingleThreadExecutor().execute(() -> {
450-
preferences.setSortOrder(FileSortOrder.Type.localFileListView, sortOrder);
451-
mFiles = sortOrder.sortLocalFiles(mFiles);
452-
453-
uiHandler.post(() -> {
450+
singleThreadExecutor.execute(() -> {
451+
List<File> sortedCopy = new ArrayList<>(mFiles);
452+
sortedCopy = sortOrder.sortLocalFiles(sortedCopy);
453+
454+
final List<File> finalSortedCopy = sortedCopy;
455+
new Handler(Looper.getMainLooper()).post(() -> {
456+
mFiles = finalSortedCopy;
457+
mFilesAll = new ArrayList<>(finalSortedCopy);
454458
notifyDataSetChanged();
455459
localFileListFragmentInterface.setLoading(false);
456460
});
@@ -591,4 +595,8 @@ public void setFiles(List<File> newFiles) {
591595
notifyDataSetChanged();
592596
localFileListFragmentInterface.setLoading(false);
593597
}
598+
599+
public void cleanup() {
600+
singleThreadExecutor.shutdown();
601+
}
594602
}

app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,4 +425,10 @@ public interface ContainerActivity {
425425
public void setupStoragePermissionWarningBanner() {
426426
mAdapter.notifyDataSetChanged();
427427
}
428+
429+
@Override
430+
public void onDestroyView() {
431+
mAdapter.cleanup();
432+
super.onDestroyView();
433+
}
428434
}

0 commit comments

Comments
 (0)