MCPcopy Create free account
hub / github.com/codezjx/AndLinker / RemoteCall

Class RemoteCall

andlinker/src/main/java/com/codezjx/andlinker/RemoteCall.java:10–131  ·  view source on GitHub ↗

Created by codezjx on 2017/10/14.

Source from the content-addressed store, hash-verified

8 * Created by codezjx on 2017/10/14.<br/>
9 */
10final class RemoteCall implements Call<Object> {
11
12 private static final String TAG = "RemoteCall";
13
14 private final ITransfer mTransferService;
15 private final ServiceMethod mServiceMethod;
16 private final Object[] mArgs;
17 private final Dispatcher mDispatcher;
18 private volatile boolean mExecuted;
19 private volatile boolean mCanceled;
20
21 RemoteCall(ITransfer transferService, ServiceMethod serviceMethod, Object[] args, Dispatcher dispatcher) {
22 mTransferService = transferService;
23 mServiceMethod = serviceMethod;
24 mArgs = args;
25 mDispatcher = dispatcher;
26 }
27
28 private Object executeInternal() throws RemoteException {
29 if (mTransferService == null) {
30 Logger.e(TAG, "TransferService null when execute, this may occur if the client is not already bind to the service.");
31 return null;
32 }
33 @SuppressWarnings("unchecked")
34 ParameterHandler<Object>[] handlers = (ParameterHandler<Object>[]) mServiceMethod.getParameterHandlers();
35
36 int argumentCount = mArgs != null ? mArgs.length : 0;
37 if (argumentCount != handlers.length) {
38 throw new IllegalArgumentException("Argument count (" + argumentCount
39 + ") doesn't match expected count (" + handlers.length + ")");
40 }
41
42 RequestBuilder requestBuilder = new RequestBuilder(mServiceMethod.getClassName(), mServiceMethod.getMethodName(), argumentCount, mServiceMethod.isOneWay());
43 for (int p = 0; p < argumentCount; p++) {
44 handlers[p].apply(requestBuilder, mArgs[p], p);
45 }
46
47 Response response = mTransferService.execute(requestBuilder.build());
48 // May return null in one-way mode.
49 if (response == null) {
50 return null;
51 }
52 if (response.getStatusCode() != Response.STATUS_CODE_SUCCESS) {
53 Logger.e(TAG, "Execute remote call fail: " + response.toString());
54 }
55 return response.getResult();
56 }
57
58 @Override
59 public Object execute() {
60 checkExecuted();
61 if (mCanceled) {
62 Logger.w(TAG, "Already canceled");
63 return null;
64 }
65 Object result = null;
66 try {
67 result = executeInternal();

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected