Pull to refresh

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

Reading time 2 min
Views 40K


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



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 выключает процесс через 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!).
Tags:
Hubs:
+22
Comments 22
Comments Comments 22

Articles