From c62a92bda97d3d5ff66b05e9193eb9dce13e8d6b Mon Sep 17 00:00:00 2001 From: Gianlu Date: Wed, 27 Feb 2019 13:44:25 +0100 Subject: [PATCH] Improvements in memory handling --- CommonUtils | 2 +- .../gianlu/aria2app/NetIO/AbstractClient.java | 4 +- .../gianlu/aria2app/NetIO/Aria2/Download.java | 62 ++++++++++++++----- .../NetIO/Aria2/DownloadWithUpdate.java | 6 +- .../gianlu/aria2app/NetIO/AriaRequests.java | 28 ++++----- .../aria2app/NetIO/ClientInterface.java | 4 +- .../com/gianlu/aria2app/NetIO/HttpClient.java | 2 - .../aria2app/NetIO/NetInstanceHolder.java | 2 +- .../aria2app/NetIO/WebSocketClient.java | 6 +- 9 files changed, 71 insertions(+), 45 deletions(-) diff --git a/CommonUtils b/CommonUtils index deb534f64..8097bdfd8 160000 --- a/CommonUtils +++ b/CommonUtils @@ -1 +1 @@ -Subproject commit deb534f64fedf89bde21583ce5444243b42da67e +Subproject commit 8097bdfd8ee8339fdf1c9e01421b42462aa63d20 diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/AbstractClient.java b/app/src/main/java/com/gianlu/aria2app/NetIO/AbstractClient.java index 6448cf6a2..1d4b4d86d 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/AbstractClient.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/AbstractClient.java @@ -108,7 +108,7 @@ protected final void validateResponse(JSONObject resp) throws JSONException, Ari if (resp.has("error")) throw new AriaException(resp.getJSONObject("error")); } - public final void batch(BatchSandbox sandbox, OnResult listener) { + public final void batch(@NonNull BatchSandbox sandbox, OnResult listener) { batch(sandbox, new DoBatch() { @Override public void onSandboxReturned(@NonNull R result) { @@ -207,7 +207,7 @@ public abstract static class Processor { @NonNull @WorkerThread - public abstract R process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException; + public abstract R process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException; } public static class AriaRequest { diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/Download.java b/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/Download.java index bc5270986..5971a4b3d 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/Download.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/Download.java @@ -4,11 +4,13 @@ import com.gianlu.aria2app.NetIO.AbstractClient; import com.gianlu.aria2app.NetIO.AriaRequests; +import com.gianlu.aria2app.NetIO.ClientInterface; import com.gianlu.aria2app.R; import com.gianlu.commonutils.CommonUtils; import org.json.JSONException; +import java.lang.ref.WeakReference; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; @@ -19,15 +21,16 @@ import java.util.Set; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; public class Download { public final String gid; - protected final AbstractClient client; + private final WeakReference client; - public Download(String gid, @NonNull AbstractClient client) { + public Download(String gid, @NonNull ClientInterface client) { this.gid = gid; - this.client = client; + this.client = new WeakReference<>(client); } @WorkerThread @@ -48,7 +51,7 @@ private static ChangeSelectionResult performSelectIndexesOperation(AbstractClien else return ChangeSelectionResult.DESELECTED; } - public void restart(final AbstractClient.OnSuccess listener) { + public void restart(AbstractClient.OnSuccess listener) { restart(new AbstractClient.OnResult() { @Override public void onResult(@NonNull String result) { @@ -71,43 +74,43 @@ public void moveDown(AbstractClient.OnSuccess listener) { } public final void options(AbstractClient.OnResult listener) { - client.send(AriaRequests.getDownloadOptions(gid), listener); + clientSend(AriaRequests.getDownloadOptions(gid), listener); } public final void servers(AbstractClient.OnResult listener) { - client.send(AriaRequests.getServers(gid), listener); + clientSend(AriaRequests.getServers(gid), listener); } public final void files(AbstractClient.OnResult listener) { - client.send(AriaRequests.getFiles(gid), listener); + clientSend(AriaRequests.getFiles(gid), listener); } public final void peers(AbstractClient.OnResult listener) { - client.send(AriaRequests.getPeers(gid), listener); + clientSend(AriaRequests.getPeers(gid), listener); } public final void changePosition(int pos, String mode, AbstractClient.OnSuccess listener) { - client.send(AriaRequests.changePosition(gid, pos, mode), listener); + clientSend(AriaRequests.changePosition(gid, pos, mode), listener); } public final void changeOptions(OptionsMap options, AbstractClient.OnSuccess listener) throws JSONException { - client.send(AriaRequests.changeDownloadOptions(gid, options), listener); + clientSend(AriaRequests.changeDownloadOptions(gid, options), listener); } public final void pause(final AbstractClient.OnSuccess listener) { - client.send(AriaRequests.pause(gid), listener); + clientSend(AriaRequests.pause(gid), listener); } public final void unpause(AbstractClient.OnSuccess listener) { - client.send(AriaRequests.unpause(gid), listener); + clientSend(AriaRequests.unpause(gid), listener); } public final void moveRelative(int relative, AbstractClient.OnSuccess listener) { - client.send(AriaRequests.changePosition(gid, relative, "POS_CUR"), listener); + clientSend(AriaRequests.changePosition(gid, relative, "POS_CUR"), listener); } public final void restart(AbstractClient.OnResult listener) { - client.batch(client -> { + clientBatch(client -> { DownloadWithUpdate old = client.sendSync(AriaRequests.tellStatus(gid)); OptionsMap oldOptions = client.sendSync(AriaRequests.getDownloadOptions(gid)); @@ -122,7 +125,7 @@ public final void restart(AbstractClient.OnResult listener) { } public final void remove(final boolean removeMetadata, AbstractClient.OnResult listener) { - client.batch(client -> { + clientBatch(client -> { DownloadWithUpdate.SmallUpdate last = client.sendSync(AriaRequests.tellStatus(gid)).update(); if (last.status == Status.COMPLETE || last.status == Status.ERROR || last.status == Status.REMOVED) { client.sendSync(AriaRequests.removeDownloadResult(gid)); @@ -140,7 +143,7 @@ public final void remove(final boolean removeMetadata, AbstractClient.OnResult listener) { - client.batch(client -> { + clientBatch(client -> { OptionsMap options = client.sendSync(AriaRequests.getDownloadOptions(gid)); OptionsMap.OptionValue currIndexes = options.get("select-file"); if (currIndexes == null) @@ -150,6 +153,32 @@ public final void changeSelection(final Integer[] selIndexes, final boolean sele }, listener); } + @Nullable + private ClientInterface client() { + return client.get(); + } + + private void clientBatch(AbstractClient.BatchSandbox sandbox, AbstractClient.OnResult listener) { + ClientInterface client = client(); + if (client == null) + listener.onException(new IllegalStateException("Client has been garbage collected.")); + else client.batch(sandbox, listener); + } + + private void clientSend(@NonNull AbstractClient.AriaRequestWithResult request, AbstractClient.OnResult listener) { + ClientInterface client = client(); + if (client == null) + listener.onException(new IllegalStateException("Client has been garbage collected.")); + else client.send(request, listener); + } + + private void clientSend(@NonNull AbstractClient.AriaRequest request, AbstractClient.OnSuccess listener) { + ClientInterface client = client(); + if (client == null) + listener.onException(new IllegalStateException("Client has been garbage collected.")); + else client.send(request, listener); + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -175,7 +204,6 @@ public enum RemoveResult { REMOVED_RESULT_AND_METADATA } - public enum Status { ACTIVE, PAUSED, WAITING, ERROR, REMOVED, COMPLETE; diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/DownloadWithUpdate.java b/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/DownloadWithUpdate.java index 369e917a5..7d11b91bc 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/DownloadWithUpdate.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/DownloadWithUpdate.java @@ -2,7 +2,7 @@ import android.os.Build; -import com.gianlu.aria2app.NetIO.AbstractClient; +import com.gianlu.aria2app.NetIO.ClientInterface; import com.gianlu.aria2app.R; import com.gianlu.commonutils.Adapters.Filterable; import com.gianlu.commonutils.Logging; @@ -23,12 +23,12 @@ public class DownloadWithUpdate extends Download implements Filterable> DOWNLOADS_LIST_PROCESSOR = new AbstractClient.Processor>() { @NonNull @Override - public List process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public List process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { List list = new ArrayList<>(); JSONArray array = obj.getJSONArray("result"); for (int i = 0; i < array.length(); i++) @@ -40,7 +40,7 @@ public List process(@NonNull AbstractClient client, @NonNull private static final AbstractClient.Processor STRING_PROCESSOR = new AbstractClient.Processor() { @NonNull @Override - public String process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public String process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return obj.getString("result"); } }; @@ -60,7 +60,7 @@ public static AbstractClient.AriaRequestWithResult getServers(Str return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_SERVERS, new AbstractClient.Processor() { @NonNull @Override - public SparseServers process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public SparseServers process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new SparseServers(obj.getJSONArray("result")); } }, gid); @@ -71,7 +71,7 @@ public static AbstractClient.AriaRequestWithResult getPeers(String gid) { return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_PEERS, new AbstractClient.Processor() { @NonNull @Override - public Peers process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public Peers process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new Peers(obj.getJSONArray("result")); } }, gid); @@ -82,7 +82,7 @@ public static AbstractClient.AriaRequestWithResult getFiles(String gi return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_FILES, new AbstractClient.Processor() { @NonNull @Override - public AriaFiles process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public AriaFiles process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new AriaFiles(obj.getJSONArray("result")); } }, gid); @@ -93,7 +93,7 @@ public static AbstractClient.AriaRequestWithResult getFileIndexes(fin return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_FILES, new AbstractClient.Processor() { @NonNull @Override - public Integer[] process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public Integer[] process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { JSONArray array = obj.getJSONArray("result"); Integer[] indexes = new Integer[array.length()]; for (int i = 0; i < array.length(); i++) @@ -180,7 +180,7 @@ public static AbstractClient.AriaRequestWithResult getGlobalOptions( return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_GLOBAL_OPTIONS, new AbstractClient.Processor() { @NonNull @Override - public OptionsMap process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public OptionsMap process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new OptionsMap(obj.getJSONObject("result")); } }); @@ -191,7 +191,7 @@ public static AbstractClient.AriaRequestWithResult getDownloadOption return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_DOWNLOAD_OPTIONS, new AbstractClient.Processor() { @NonNull @Override - public OptionsMap process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public OptionsMap process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new OptionsMap(obj.getJSONObject("result")); } }, gid); @@ -202,7 +202,7 @@ public static AbstractClient.AriaRequestWithResult getGlobalStats() return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_GLOBAL_STATS, new AbstractClient.Processor() { @NonNull @Override - public GlobalStats process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public GlobalStats process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new GlobalStats(obj.getJSONObject("result")); } }); @@ -213,7 +213,7 @@ public static AbstractClient.AriaRequestWithResult> listMethods() { return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.LIST_METHODS, new AbstractClient.Processor>() { @NonNull @Override - public List process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public List process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return CommonUtils.toStringsList(obj.getJSONArray("result"), false); } }); @@ -224,7 +224,7 @@ public static AbstractClient.AriaRequestWithResult getSessionInfo() return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_SESSION_INFO, new AbstractClient.Processor() { @NonNull @Override - public SessionInfo process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public SessionInfo process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new SessionInfo(obj.getJSONObject("result")); } }); @@ -290,7 +290,7 @@ public static AbstractClient.AriaRequestWithResult tellStatu return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.TELL_STATUS, new AbstractClient.Processor() { @NonNull @Override - public DownloadWithUpdate process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public DownloadWithUpdate process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return DownloadWithUpdate.create(client, obj.getJSONObject("result"), false); } }, gid); @@ -301,7 +301,7 @@ public static AbstractClient.AriaRequestWithResult tellStatu return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.TELL_STATUS, new AbstractClient.Processor() { @NonNull @Override - public DownloadWithUpdate process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public DownloadWithUpdate process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return download.update(obj.getJSONObject("result"), false); } }, download.gid); @@ -327,7 +327,7 @@ public static AbstractClient.AriaRequestWithResult getVersion() { return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_VERSION, new AbstractClient.Processor() { @NonNull @Override - public VersionInfo process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException { + public VersionInfo process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException { return new VersionInfo(obj.getJSONObject("result")); } }); diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/ClientInterface.java b/app/src/main/java/com/gianlu/aria2app/NetIO/ClientInterface.java index 99bd4d757..682650ec4 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/ClientInterface.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/ClientInterface.java @@ -5,9 +5,9 @@ public interface ClientInterface { void close(); - void send(@NonNull final AbstractClient.AriaRequestWithResult request, final AbstractClient.OnResult listener); + void send(@NonNull AbstractClient.AriaRequestWithResult request, AbstractClient.OnResult listener); void send(@NonNull AbstractClient.AriaRequest request, AbstractClient.OnSuccess listener); - void batch(AbstractClient.BatchSandbox sandbox, AbstractClient.OnResult listener); + void batch(@NonNull AbstractClient.BatchSandbox sandbox, AbstractClient.OnResult listener); } diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/HttpClient.java b/app/src/main/java/com/gianlu/aria2app/NetIO/HttpClient.java index b5bcc0585..853b54261 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/HttpClient.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/HttpClient.java @@ -147,6 +147,4 @@ public void run() { } } } - - } diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/NetInstanceHolder.java b/app/src/main/java/com/gianlu/aria2app/NetIO/NetInstanceHolder.java index a6f1c6e80..d2a540279 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/NetInstanceHolder.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/NetInstanceHolder.java @@ -90,7 +90,7 @@ public void send(@NonNull AbstractClient.AriaRequest request, AbstractClient.OnS } @Override - public void batch(AbstractClient.BatchSandbox sandbox, AbstractClient.OnResult listener) { + public void batch(@NonNull AbstractClient.BatchSandbox sandbox, AbstractClient.OnResult listener) { if (current != null) current.batch(sandbox, listener); } } diff --git a/app/src/main/java/com/gianlu/aria2app/NetIO/WebSocketClient.java b/app/src/main/java/com/gianlu/aria2app/NetIO/WebSocketClient.java index 11e26666d..6c2e4a69c 100644 --- a/app/src/main/java/com/gianlu/aria2app/NetIO/WebSocketClient.java +++ b/app/src/main/java/com/gianlu/aria2app/NetIO/WebSocketClient.java @@ -91,17 +91,17 @@ public JSONObject sendSync(long id, @NonNull JSONObject request) throws Exceptio if (closed) throw new IllegalStateException("Client is closed: " + this); - if (requests.size() > 10) requests.clear(); - InternalResponse internal = new InternalResponse(); requests.put(id, internal); webSocket.send(request.toString()); synchronized (internal) { - internal.wait(); + internal.wait(5000); } + requests.remove(id); + if (internal.obj != null) return internal.obj; else throw internal.ex; }