![](https://habrastorage.org/getpro/habr/post_images/419/e8f/8c5/419e8f8c5d5394e8b008979d1bf39d07.png)
Речь пойдёт о проекте-утилитке, который может пригодиться всякому кто изучает 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) { // Тут же ловим все исключения
setErrorColor();
ex.printStackTrace();
}
}
Здесь же можно задавать аргументы командной строки — старый добрый
args
. Пример — запуск BankTellerSimulation
на 10 секунд:BankTellerSimulation.main(new String[] { "10" });
Поддерживается работа нескольких потоков (
SimpleThreadsTest
):![](https://habrastorage.org/getpro/habr/post_images/a5f/17a/9d7/a5f17a9d731d08e4c06dec053ae63745.png)
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!!!");
Получаем исключение:
![](https://habrastorage.org/getpro/habr/post_images/cfe/8f4/92c/cfe8f492cfb46d60b0acfc4ba029ff09.png)
Ввод
Напоследок, для полноты возможностей, был добавлен консольный ввод. Пока что мои познания в области пользовательского интерфейса Android не велики. Кое-как впихнуть
EditText
удалось, но результат не идеален :)Приглашение ввода строки (
ReadingInputTest
):![](https://habrastorage.org/getpro/habr/post_images/bbf/dce/667/bbfdce6674eaa2e1026aff264894bf78.png)
Далее:
![](https://habrastorage.org/getpro/habr/post_images/bc5/861/fa2/bc5861fa2f4a3496664a285cea9fc328.png)
Функции меню
Exit выключает процесс через
System.exit(0)
.Программа «одноразовая». Повторных перезапусков нет (не хотелось возиться с очисткой значений статических полей).
Что делает Clear — большой секрет.
Что не работает
•
assert
'ы Java. Т.е. оператор assert "Cat".equals("Dog");
исключение
java.lang.AssertionError
не кинет. Не путать с assert'ами JUnit — с ними всё в порядке!)• Класс
Console
.• Поле ввода не всегда подхватывает фокус.
Файлы проекта
Исходники можно забрать с GitHub, либо скачать zip-архив с проектами для Android Studio и Eclipse.
Описанные примеры находятся в пакете
com.examples
. Все примеры можно без изменений запускать на обычном ПК (run everywhere!).