Skip to content

Commit

Permalink
Improvements in memory handling
Browse files Browse the repository at this point in the history
  • Loading branch information
devgianlu committed Feb 27, 2019
1 parent 0c85e8c commit c62a92b
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 <R> void batch(BatchSandbox<R> sandbox, OnResult<R> listener) {
public final <R> void batch(@NonNull BatchSandbox<R> sandbox, OnResult<R> listener) {
batch(sandbox, new DoBatch<R>() {
@Override
public void onSandboxReturned(@NonNull R result) {
Expand Down Expand Up @@ -207,7 +207,7 @@ public abstract static class Processor<R> {

@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 {
Expand Down
62 changes: 45 additions & 17 deletions app/src/main/java/com/gianlu/aria2app/NetIO/Aria2/Download.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<ClientInterface> 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
Expand All @@ -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<String>() {
@Override
public void onResult(@NonNull String result) {
Expand All @@ -71,43 +74,43 @@ public void moveDown(AbstractClient.OnSuccess listener) {
}

public final void options(AbstractClient.OnResult<OptionsMap> listener) {
client.send(AriaRequests.getDownloadOptions(gid), listener);
clientSend(AriaRequests.getDownloadOptions(gid), listener);
}

public final void servers(AbstractClient.OnResult<SparseServers> listener) {
client.send(AriaRequests.getServers(gid), listener);
clientSend(AriaRequests.getServers(gid), listener);
}

public final void files(AbstractClient.OnResult<AriaFiles> listener) {
client.send(AriaRequests.getFiles(gid), listener);
clientSend(AriaRequests.getFiles(gid), listener);
}

public final void peers(AbstractClient.OnResult<Peers> 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<String> listener) {
client.batch(client -> {
clientBatch(client -> {
DownloadWithUpdate old = client.sendSync(AriaRequests.tellStatus(gid));
OptionsMap oldOptions = client.sendSync(AriaRequests.getDownloadOptions(gid));

Expand All @@ -122,7 +125,7 @@ public final void restart(AbstractClient.OnResult<String> listener) {
}

public final void remove(final boolean removeMetadata, AbstractClient.OnResult<RemoveResult> 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));
Expand All @@ -140,7 +143,7 @@ public final void remove(final boolean removeMetadata, AbstractClient.OnResult<R
}

public final void changeSelection(final Integer[] selIndexes, final boolean select, AbstractClient.OnResult<ChangeSelectionResult> listener) {
client.batch(client -> {
clientBatch(client -> {
OptionsMap options = client.sendSync(AriaRequests.getDownloadOptions(gid));
OptionsMap.OptionValue currIndexes = options.get("select-file");
if (currIndexes == null)
Expand All @@ -150,6 +153,32 @@ public final void changeSelection(final Integer[] selIndexes, final boolean sele
}, listener);
}

@Nullable
private ClientInterface client() {
return client.get();
}

private <R> void clientBatch(AbstractClient.BatchSandbox<R> sandbox, AbstractClient.OnResult<R> listener) {
ClientInterface client = client();
if (client == null)
listener.onException(new IllegalStateException("Client has been garbage collected."));
else client.batch(sandbox, listener);
}

private <R> void clientSend(@NonNull AbstractClient.AriaRequestWithResult<R> request, AbstractClient.OnResult<R> 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;
Expand All @@ -175,7 +204,6 @@ public enum RemoveResult {
REMOVED_RESULT_AND_METADATA
}


public enum Status {
ACTIVE, PAUSED, WAITING, ERROR, REMOVED, COMPLETE;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,12 +23,12 @@ public class DownloadWithUpdate extends Download implements Filterable<Download.
private final Object lock = new Object();
private SmallUpdate update;

private DownloadWithUpdate(@NonNull String gid, @NonNull AbstractClient client) {
private DownloadWithUpdate(@NonNull String gid, @NonNull ClientInterface client) {
super(gid, client);
}

@NonNull
public static DownloadWithUpdate create(AbstractClient client, JSONObject obj, boolean small) throws JSONException {
public static DownloadWithUpdate create(ClientInterface client, JSONObject obj, boolean small) throws JSONException {
DownloadWithUpdate download = new DownloadWithUpdate(obj.getString("gid"), client);
download.update(obj, small);
return download;
Expand Down
28 changes: 14 additions & 14 deletions app/src/main/java/com/gianlu/aria2app/NetIO/AriaRequests.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public final class AriaRequests {
private static final AbstractClient.Processor<List<DownloadWithUpdate>> DOWNLOADS_LIST_PROCESSOR = new AbstractClient.Processor<List<DownloadWithUpdate>>() {
@NonNull
@Override
public List<DownloadWithUpdate> process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException {
public List<DownloadWithUpdate> process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException {
List<DownloadWithUpdate> list = new ArrayList<>();
JSONArray array = obj.getJSONArray("result");
for (int i = 0; i < array.length(); i++)
Expand All @@ -40,7 +40,7 @@ public List<DownloadWithUpdate> process(@NonNull AbstractClient client, @NonNull
private static final AbstractClient.Processor<String> STRING_PROCESSOR = new AbstractClient.Processor<String>() {
@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");
}
};
Expand All @@ -60,7 +60,7 @@ public static AbstractClient.AriaRequestWithResult<SparseServers> getServers(Str
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_SERVERS, new AbstractClient.Processor<SparseServers>() {
@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);
Expand All @@ -71,7 +71,7 @@ public static AbstractClient.AriaRequestWithResult<Peers> getPeers(String gid) {
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_PEERS, new AbstractClient.Processor<Peers>() {
@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);
Expand All @@ -82,7 +82,7 @@ public static AbstractClient.AriaRequestWithResult<AriaFiles> getFiles(String gi
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_FILES, new AbstractClient.Processor<AriaFiles>() {
@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);
Expand All @@ -93,7 +93,7 @@ public static AbstractClient.AriaRequestWithResult<Integer[]> getFileIndexes(fin
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_FILES, new AbstractClient.Processor<Integer[]>() {
@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++)
Expand Down Expand Up @@ -180,7 +180,7 @@ public static AbstractClient.AriaRequestWithResult<OptionsMap> getGlobalOptions(
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_GLOBAL_OPTIONS, new AbstractClient.Processor<OptionsMap>() {
@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"));
}
});
Expand All @@ -191,7 +191,7 @@ public static AbstractClient.AriaRequestWithResult<OptionsMap> getDownloadOption
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_DOWNLOAD_OPTIONS, new AbstractClient.Processor<OptionsMap>() {
@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);
Expand All @@ -202,7 +202,7 @@ public static AbstractClient.AriaRequestWithResult<GlobalStats> getGlobalStats()
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_GLOBAL_STATS, new AbstractClient.Processor<GlobalStats>() {
@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"));
}
});
Expand All @@ -213,7 +213,7 @@ public static AbstractClient.AriaRequestWithResult<List<String>> listMethods() {
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.LIST_METHODS, new AbstractClient.Processor<List<String>>() {
@NonNull
@Override
public List<String> process(@NonNull AbstractClient client, @NonNull JSONObject obj) throws JSONException {
public List<String> process(@NonNull ClientInterface client, @NonNull JSONObject obj) throws JSONException {
return CommonUtils.toStringsList(obj.getJSONArray("result"), false);
}
});
Expand All @@ -224,7 +224,7 @@ public static AbstractClient.AriaRequestWithResult<SessionInfo> getSessionInfo()
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_SESSION_INFO, new AbstractClient.Processor<SessionInfo>() {
@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"));
}
});
Expand Down Expand Up @@ -290,7 +290,7 @@ public static AbstractClient.AriaRequestWithResult<DownloadWithUpdate> tellStatu
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.TELL_STATUS, new AbstractClient.Processor<DownloadWithUpdate>() {
@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);
Expand All @@ -301,7 +301,7 @@ public static AbstractClient.AriaRequestWithResult<DownloadWithUpdate> tellStatu
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.TELL_STATUS, new AbstractClient.Processor<DownloadWithUpdate>() {
@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);
Expand All @@ -327,7 +327,7 @@ public static AbstractClient.AriaRequestWithResult<VersionInfo> getVersion() {
return new AbstractClient.AriaRequestWithResult<>(AbstractClient.Method.GET_VERSION, new AbstractClient.Processor<VersionInfo>() {
@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"));
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
public interface ClientInterface {
void close();

<R> void send(@NonNull final AbstractClient.AriaRequestWithResult<R> request, final AbstractClient.OnResult<R> listener);
<R> void send(@NonNull AbstractClient.AriaRequestWithResult<R> request, AbstractClient.OnResult<R> listener);

void send(@NonNull AbstractClient.AriaRequest request, AbstractClient.OnSuccess listener);

<R> void batch(AbstractClient.BatchSandbox<R> sandbox, AbstractClient.OnResult<R> listener);
<R> void batch(@NonNull AbstractClient.BatchSandbox<R> sandbox, AbstractClient.OnResult<R> listener);
}
2 changes: 0 additions & 2 deletions app/src/main/java/com/gianlu/aria2app/NetIO/HttpClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,4 @@ public void run() {
}
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public void send(@NonNull AbstractClient.AriaRequest request, AbstractClient.OnS
}

@Override
public <R> void batch(AbstractClient.BatchSandbox<R> sandbox, AbstractClient.OnResult<R> listener) {
public <R> void batch(@NonNull AbstractClient.BatchSandbox<R> sandbox, AbstractClient.OnResult<R> listener) {
if (current != null) current.batch(sandbox, listener);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit c62a92b

Please sign in to comment.