Запускаем консольные Java приложения на Android

от автора

Речь пойдёт о проекте-утилитке, который может пригодиться всякому кто изучает Java и не всегда имеет под рукой ПК для просмотра работы примера кода в полевых условиях (как-то — в метро, маршрутке, кафешке и т.д.).

Необходимость создать сие поделище возникла когда я готовился к OCJP-сертификации. После успешного прохождения оной, решил предоставить плоды своих задумок на обозрение уважаемым участникам хабрасообщества.

Ноутбука у меня нет, а запускать примеры кода на смартфоне, сидя на кухне за чашечкой чая, удобно.

Так уж повелось, что бо́льшая часть примеров для обучения обычно приводится именно в формате консольных программ. Замечательный инструмент AIDE позволяет собирать Android-приложение на основе Eclipse-проектов. Возможность, увы, недостаточная для запуска консольных примеров методом копипасты.

Дело за малым — перенаправляем потоки ввода/вывода в UI контролы:

    private static OutputStream mOutputStream = new OutputStream() {             @Override             public void write(int b) {                 MainActivity.getInstance().write((byte)b);             }     };      @Override     public void onCreate(Bundle savedInstanceState) {         ...         System.setOut(new PrintStream(mOutputStream));         System.setErr(new PrintStream(mOutputStream));         ...     } 

Консольная программа стартует в отдельном потоке из обработчика activity onResume():

			@Override 			public void run() { 		    	try { 			    	// 			    	// Здесь запускается консольное приложение 			    	// 		    		Program.main(new String[0]); 		    	} catch (Throwable ex) { // Тут же ловим все исключения 		    		mOutput.setTextColor(Color.RED); 		    		ex.printStackTrace(); 		    	} 			} 

Здесь же можно задавать аргументы коммандной строки — старый добрый args. Пример — запуск BankTellerSimulation на 10 секунд:

BankTellerSimulation.main(new String[] { "10" }); 

Поддерживается работа нескольких потоков (SimpleThreadsTest):

HorseRace и BankTellerSimulation — примеры более сложных многопоточных приложений (взяты из книги Thinking in Java, 4th Ed by Bruce Eckel).

Ошибки времени выполнения

Пример ErrorTest:

class FuuuuuuException extends RuntimeException { 	public FuuuuuuException(String message) { 		super(message); 	} } ... throw new FuuuuuuException("!!!TROLLFACE!!!"); 

Получаем исключение:

Ввод

Напоследок, для полноты возможностей, был добавлен и консольный ввод. Пока что мои познания в области пользовательского интерфейса Android не велики. Кое-как впихнуть EditText удалось, но результат не идеален 🙂

Приглашение ввода строки (ReadingInputTest):

Далее:

Exit

Единственная функция которая есть у программы в главном меню. Exit выключает процесс через System.exit(0).

Программа «одноразовая». Повторных перезапусков нет (не хотелось возиться с очисткой значений статических полей).

Что не работает

assert‘ы.
• Класс Console.
• Поле ввода не всегда подхватывает фокус.

Архив с Eclipse-проектом: ConsoleApp.zip.
Описанные примеры находятся в пакете com.examples. Все примеры можно без изменений запускать на обычном ПК (run everywhere!).

ссылка на оригинал статьи http://habrahabr.ru/post/162741/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *