Речь пойдёт о проекте-утилитке, который может пригодиться всякому кто изучает 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!).
Автор: 1111paha1111