Skip to content

Commit 18030da

Browse files
committed
使用Builder模式创建命令任务
1 parent 0024757 commit 18030da

File tree

4 files changed

+296
-188
lines changed

4 files changed

+296
-188
lines changed

AndroidExecLibrary/src/main/java/com/excellence/exec/Command.java

Lines changed: 22 additions & 185 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,9 @@
44
import android.os.Looper;
55
import android.support.annotation.NonNull;
66

7-
import java.io.BufferedReader;
8-
import java.io.InputStreamReader;
97
import java.util.LinkedList;
108
import java.util.List;
119
import java.util.concurrent.Executor;
12-
import java.util.concurrent.TimeUnit;
13-
14-
import io.reactivex.Observable;
15-
import io.reactivex.ObservableEmitter;
16-
import io.reactivex.ObservableOnSubscribe;
17-
import io.reactivex.disposables.Disposable;
18-
import io.reactivex.functions.Consumer;
19-
import io.reactivex.schedulers.Schedulers;
2010

2111
/**
2212
* <pre>
@@ -26,7 +16,7 @@
2616
* desc :
2717
* </pre>
2818
*/
29-
public class Command {
19+
class Command {
3020

3121
private static final String TAG = Command.class.getSimpleName();
3222

@@ -57,13 +47,26 @@ public void execute(@NonNull Runnable command) {
5747
};
5848
}
5949

60-
public CommandTask addTask(List<String> command, IListener listener) {
61-
CommandTask task = new CommandTask(command, listener);
50+
protected int getTimeOut() {
51+
return mTimeOut;
52+
}
53+
54+
protected Executor getResponsePoster() {
55+
return mResponsePoster;
56+
}
57+
58+
@Deprecated
59+
protected CommandTask addTask(List<String> command, IListener listener) {
60+
CommandTask task = new CommandTask.Builder().command(command).build();
61+
task.deploy(listener);
62+
return task;
63+
}
64+
65+
protected void addTask(CommandTask task) {
6266
synchronized (mTaskQueue) {
6367
mTaskQueue.add(task);
6468
}
6569
schedule();
66-
return task;
6770
}
6871

6972
private synchronized void schedule() {
@@ -88,8 +91,12 @@ private synchronized void schedule() {
8891
}
8992
}
9093

91-
private synchronized void remove(CommandTask task) {
94+
protected synchronized void removeTask(CommandTask task) {
9295
mTaskQueue.remove(task);
96+
}
97+
98+
protected synchronized void remove(CommandTask task) {
99+
removeTask(task);
93100
schedule();
94101
}
95102

@@ -102,174 +109,4 @@ public synchronized void clearAll() {
102109
}
103110
}
104111

105-
public class CommandTask {
106-
107-
private static final int STATUS_WAITING = 0;
108-
private static final int STATUS_FINISHED = 1;
109-
private static final int STATUS_RUNNING = 2;
110-
private static final int STATUS_INTERRUPT = 3;
111-
112-
private List<String> mCommand = null;
113-
private Process mProcess = null;
114-
private int mStatus = STATUS_WAITING;
115-
private IListener mIListener = null;
116-
private Disposable mTimer = null;
117-
private String mCmd = null;
118-
119-
private CommandTask(List<String> command, final IListener listener) {
120-
mCommand = command;
121-
mIListener = new IListener() {
122-
@Override
123-
public void onPre(final String command) {
124-
mResponsePoster.execute(new Runnable() {
125-
@Override
126-
public void run() {
127-
if (listener != null) {
128-
listener.onPre(command);
129-
}
130-
}
131-
});
132-
}
133-
134-
@Override
135-
public void onProgress(final String message) {
136-
mResponsePoster.execute(new Runnable() {
137-
@Override
138-
public void run() {
139-
if (listener != null) {
140-
listener.onProgress(message);
141-
}
142-
}
143-
});
144-
}
145-
146-
@Override
147-
public void onError(final Throwable t) {
148-
mResponsePoster.execute(new Runnable() {
149-
@Override
150-
public void run() {
151-
if (mStatus != STATUS_INTERRUPT) {
152-
if (listener != null) {
153-
listener.onError(t);
154-
}
155-
}
156-
mStatus = STATUS_FINISHED;
157-
remove(CommandTask.this);
158-
}
159-
});
160-
}
161-
162-
@Override
163-
public void onSuccess(final String message) {
164-
mResponsePoster.execute(new Runnable() {
165-
@Override
166-
public void run() {
167-
mStatus = STATUS_FINISHED;
168-
if (listener != null) {
169-
listener.onSuccess(message);
170-
}
171-
remove(CommandTask.this);
172-
}
173-
});
174-
}
175-
};
176-
}
177-
178-
void deploy() {
179-
try {
180-
// only wait task can deploy
181-
if (mStatus != STATUS_WAITING) {
182-
return;
183-
}
184-
mStatus = STATUS_RUNNING;
185-
Observable.create(new ObservableOnSubscribe<String>() {
186-
@Override
187-
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
188-
if (mStatus == STATUS_INTERRUPT) {
189-
return;
190-
}
191-
192-
StringBuilder cmd = new StringBuilder();
193-
for (String item : mCommand) {
194-
cmd.append(item).append(" ");
195-
}
196-
mCmd = cmd.toString();
197-
mIListener.onPre(mCmd);
198-
199-
restartTimer();
200-
mProcess = new ProcessBuilder(mCommand).redirectErrorStream(true).start();
201-
202-
BufferedReader stdin = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
203-
StringBuilder result = new StringBuilder();
204-
String line = null;
205-
while (mStatus == STATUS_RUNNING && (line = stdin.readLine()) != null) {
206-
if (mStatus == STATUS_RUNNING) {
207-
restartTimer();
208-
mIListener.onProgress(line);
209-
result.append(line);
210-
}
211-
}
212-
stdin.close();
213-
resetTimer();
214-
if (mStatus == STATUS_RUNNING) {
215-
mIListener.onSuccess(result.toString());
216-
}
217-
}
218-
}).subscribeOn(Schedulers.io()).subscribe(new Consumer<String>() {
219-
@Override
220-
public void accept(String s) throws Exception {
221-
222-
}
223-
}, new Consumer<Throwable>() {
224-
@Override
225-
public void accept(Throwable throwable) throws Exception {
226-
mIListener.onError(throwable);
227-
}
228-
});
229-
} catch (Exception e) {
230-
mIListener.onError(e);
231-
}
232-
}
233-
234-
private void resetTimer() {
235-
if (mTimer != null && !mTimer.isDisposed()) {
236-
mTimer.dispose();
237-
}
238-
}
239-
240-
private void restartTimer() {
241-
resetTimer();
242-
mTimer = Observable.timer(mTimeOut, TimeUnit.MILLISECONDS).subscribe(new Consumer<Long>() {
243-
@Override
244-
public void accept(Long aLong) throws Exception {
245-
mIListener.onError(new Throwable("Time out : " + mCmd));
246-
discard();
247-
}
248-
});
249-
}
250-
251-
private boolean isRunning() {
252-
return mStatus == STATUS_RUNNING;
253-
}
254-
255-
private void killProcess() {
256-
if (mProcess != null) {
257-
// close stream
258-
mProcess.destroy();
259-
}
260-
}
261-
262-
private void cancel() {
263-
mStatus = STATUS_INTERRUPT;
264-
killProcess();
265-
mTaskQueue.remove(this);
266-
}
267-
268-
public void discard() {
269-
mStatus = STATUS_INTERRUPT;
270-
killProcess();
271-
remove(this);
272-
}
273-
274-
}
275112
}

0 commit comments

Comments
 (0)