44import android .os .Looper ;
55import android .support .annotation .NonNull ;
66
7- import java .io .BufferedReader ;
8- import java .io .InputStreamReader ;
97import java .util .LinkedList ;
108import java .util .List ;
119import 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>
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