Программирование мобильных устройств на платформе .NET Compact Framework - Иво Салмре
Шрифт:
Интервал:
Закладка:
Ниже приводится пример кода, который иллюстрирует три различных варианта организации обратной связи с пользователем, активизируемых щелчками на соответствующих кнопках. Каждая кнопка имитирует запуск определенной задачи, для выполнения которой требуется 4 секунды. Во всех случаях интерактивная связь с пользователем на время выполнения задачи теряется, однако восприятие этого факта пользователем во всех исследуемых случаях является совершенно различным. Этот пример показывает, что даже совсем незначительные факторы могут оказывать сильное влияние на оценку пользователем производительности и качественных характеристик приложения. Ниже представлены краткие описания каждого из трех вариантов организации обратной связи с пользователем в приложении, используемом в качестве примера:
1. Плохая обратная связь. В этом случае пользовательский интерфейс просто блокируется на время выполнения работы. Пользователи не получают никакого сообщения о причине блокирования, им ничего не сообщается о том, как долго будет отсутствовать связь с интерфейсом, и они не извещаются о восстановления способности приложения к отклику. Подобное поведение пользовательского интерфейса будет очень раздражать конечных пользователей, поскольку им остается только гадать, когда их щелчки на кнопках вновь смогут вызывать определенные действия со стороны приложения. Щелчки, выполненные в то время, когда приложение не проявляет ответной реакции, помещаются в очередь и обрабатываются тогда, когда приложение восстанавливает свою способность к интерактивному взаимодействию с пользователем. В результате этого, если пользователь начинает проверять, вернулось ли приложение в обычный режим, то могут быть выполнены нежелательные действия. Этот пример демонстрирует образец совершенно непродуманного, неудачного дизайна.
2. Хорошая обратная связь. В этом случае пользовательский интерфейс отображает "курсор ожидания" в течение всего периода, на протяжении которого интерфейс не способен отвечать на запросы пользователей. Наличие курсора ожидания говорит пользователям о том, что в настоящее время приложение не может реагировать на их запросы, а его исчезновение будет означать, что способность приложения реагировать на запросы восстановлена. Таким образом, для существенного улучшения поведения пользовательского интерфейса потребовались лишь самые незначительные усилия.
3. Улучшенная обратная связь. В этом случае на экране отображается не только курсор ожидания, информирующий пользователей о том, что приложение не может реагировать на их запросы, но и текстовое сообщение, объясняющее, чем именно занято приложение в данный момент. Такое поведение интерфейса еще больше устраивает пользователей, поскольку они становятся информированными участниками процесса, и пока идет работа, для них выводится пояснительный текст. Если в процессе выполнения этой работы происходят какие-либо изменения, пользователи будут об этом знать. Постоянно получая информацию о состоянии задачи, пользователи чувствуют себя комфортно. Для создания подобных условий требуется приложить немного больше усилий, чем во втором примере, но если мы в состоянии держать пользователей в курсе дел и предоставить им возможность следить за происходящими в системе изменениями, то достигнутый эффект окупит затраченные на это усилия.
Предполагается, что представленный в листинге 7.3 текст вы поместите в класс Form в проекте для Pocket PC. Для создания и выполнения примера необходимо выполнить следующие действия:
1. В Visual Studio .NET (2003 или более поздней версии) начните новый проект для Pocket PC с использованием языка C#.
2. Разместите в окне конструктора формы для Pocket PC текстовую метку и три кнопки (как показано на рис. 7.1).
3. Дважды щелкните мышью на пустом месте окна конструктора форм; в результате этого будет создан и присоединен к форме обработчик событий Form1_Load, представленный ниже. Включите в эту процедуру приведенный ниже код.
4. Дважды щелкните на кнопке Button1 формы; в результате этого будет создан и присоединен к форме обработчик событий button1_Click, представленный ниже. Включите в эту процедуру приведенный ниже код.
5. Проделайте то же самое для кнопок Button2 и Button3 и включите их коды в соответствующие процедуры.
6. Нажмите клавишу <F5> для запуска приложения на эмуляторе или физическом устройстве Pocket PC. (Если вы хотите запустить приложение без отладчика, нажмите комбинацию клавиш <Ctrl+F5>.)
Рис. 7.1. Пример приложения, иллюстрирующего различные варианты организации обратной связи с пользователем
Листинг 7.3. Демонстрация трех различных уровней организации обратной связи с пользователем//Поместить надписи на кнопках
private void Form1_Load(object sender, System.EventArgs e) {
button1.Text = "Плохая обратная связь";
button2.Text = "Хорошая обратная связь";
button3.Text = "Улучшенная обратная связь";
}
//----------------------------------------
//Пример слабых интерактивных возможностей интерфейса:
// - Визуальная индикация начала выполнения работы отсутствует
// - Визуальная индикация окончания выполнения работы отсутствует
// - Пользовательский интерфейс не способен к отклику во время работы
// - 0 завершении выполнения задачи пользователь вынужден только догадываться
//----------------------------------------
private void button1_Click(object sender, System.EventArgs e) {
//Имитировать выполнение работы путем создания паузы
//продолжительностью 4 секунды
System.Threading.Thread.Sleep(4000);
}
//----------------------------------------
//Пример лучших интерактивных возможностей интерфейса:
// + Визуальная индикация начала выполнения работы
// (появление курсора ожидания)
// + Визуальная индикация окончания выполнения работы
// (исчезновение курсора ожидания)
// - Пользовательский интерфейс не способен к отклику во время работы
// + По завершении выполнения задачи конечный пользователь узнает об этом,
// а пользовательский интерфейс восстанавливает способность к отклику
//----------------------------------------
private void button2_Click(object sender, System.EventArgs e) {
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
//Имитировать выполнение работы путем создания паузы
//продолжительностью 4 секунды
System.Threading.Thread.Sleep(4000);
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
}
//----------------------------------------
//Пример еще лучших интерактивных возможностей интерфейса:
// + Визуальная индикация начала выполнения работы // (появление курсора ожидания)
// + Отображение дополнительного текста, сообщающего пользователю // о том, что происходит
// + Визуальная индикация окончания выполнения работы // (исчезновение курсора ожидания)
// - Пользовательский интерфейс не способен к отклику в процессе работы
// + По завершении выполнения задачи конечный пользователь узнает об этом,
// а пользовательский интерфейс восстанавливает способность к отклику
// + Текстовые сообщения информируют пользователя о том, что происходит
//----------------------------------------
private void button3_Click(object sender, System.EventArgs e) {
//Предоставить пользователю текст, информирующий его обо всем происходящем
label1.Text = "Ждите! Работа выполняется!";
//Заставить интерфейс обновить текст
//(иначе он сделает это только тогда, когда будет перерисовывать сообщение,
//a это может произойти и после выхода из данной функции)
label1.Update();
//Отобразить курсор ожидания
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
//Имитировать выполнение работы путем создания паузы
//продолжительностью 2,8 секунды
System.Threading.Thread.Sleep(2800);
//Необязательное дополнительное обновление состояния
label1.Text = "Ждите! Работа близка к завершению!";
label1.Update();
//Имитировать выполнение работы путем создания паузы
//продолжительностью 1,2 секунды
System.Threading.Thread.Sleep(1200);
//Известить пользователя текстовым сообщением о завершении работы
//(текст обновляется всякий раз, когда ПИ выполняет обычное
//обновление экрана)
label1.Text = "Работа успешно завершена!";
//Избавиться от курсора ожидания
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;