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

в 9:39, , рубрики: android, java, обучение программированию, Разработка под android, метки: ,

Запускаем консольные 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):

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

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!!!");

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

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

Ввод

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

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

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

Далее:

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

Exit

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

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

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

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

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

Автор: 1111paha1111

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js