Речь пойдёт о проекте-утилитке, который может пригодиться всякому кто изучает 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/
Добавить комментарий