Fix concurrency issues with loading replays in replay viewer

This commit is contained in:
johni0702
2015-08-13 10:56:46 +02:00
parent ee6835c279
commit 8f699a9140

View File

@@ -55,21 +55,23 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback {
private Thread fileReloader;
private class FileReloaderThread extends Thread {
private final GuiLoadingListEntry loadingListEntry = new GuiLoadingListEntry();
@Override
public synchronized void start() {
replayFileList = new ArrayList<Pair<Pair<File, ReplayMetaData>, File>>();
replayGuiList.clearEntries();
replayGuiList.addEntry(loadingListEntry);
super.start();
}
@Override
public void run() {
final GuiLoadingListEntry loadingListEntry = new GuiLoadingListEntry();
replayGuiList.clearEntries();
replayGuiList.addEntry(loadingListEntry);
replayFileList = new ArrayList<Pair<Pair<File, ReplayMetaData>, File>>();
for(File file : ReplayFileIO.getAllReplayFiles()) {
for(final File file : ReplayFileIO.getAllReplayFiles()) {
if(interrupted()) break;
try {
ReplayFile replayFile = new ReplayFile(file);
ReplayMetaData metaData = replayFile.metadata().get();
final ReplayMetaData metaData = replayFile.metadata().get();
BufferedImage img = replayFile.thumb().get();
replayFile.close();
@@ -83,16 +85,13 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback {
ImageIO.write(img, "jpg", tmp);
}
final Pair<Pair<File, ReplayMetaData>, File> p = Pair.of(Pair.of(file, metaData), tmp);
final int index = getInsertionIndex(p, replayFileList);
replayFileList.add(index, p);
final FileInfo fileInfo = new FileInfo(-1, p.first().second(), null, null,
-1, -1, -1, FilenameUtils.getBaseName(p.first().first().getName()), true, -1);
replayGuiList.addEntry(index, new GuiReplayListEntry(replayGuiList, fileInfo, p.second()));
final File thumb = tmp;
mc.addScheduledTask(new Runnable() {
@Override
public void run() {
addEntry(file, metaData, thumb);
}
});
} catch(Exception e) {
e.printStackTrace();
}
@@ -302,6 +301,18 @@ public class GuiReplayViewer extends GuiScreen implements GuiYesNoCallback {
}
private void addEntry(File file, ReplayMetaData metaData, File thumb) {
final Pair<Pair<File, ReplayMetaData>, File> p = Pair.of(Pair.of(file, metaData), thumb);
final int index = getInsertionIndex(p, replayFileList);
replayFileList.add(index, p);
final FileInfo fileInfo = new FileInfo(-1, p.first().second(), null, null,
-1, -1, -1, FilenameUtils.getBaseName(p.first().first().getName()), true, -1);
replayGuiList.addEntry(index, new GuiReplayListEntry(replayGuiList, fileInfo, p.second()));
}
private static FileAgeComparator fileAgeComparator = new FileAgeComparator();
public static class FileAgeComparator implements Comparator<Pair<Pair<File, ReplayMetaData>, File>> {