Все началось с того, что мне вдруг очень захотелось сделать что-нибудь под андроид. И все это несмотря на то, что java — не мой родной язык.
В процессе создания своего приложения я столкнулся с несколькими трудностями, о решении которых и хочу поведать. Думаю, они будут полезны, таким же как я, новичкам, и буду благодарен за советы и более красивые примеры от гуру.
Но главное подтверждение работоспособности примеров — это то что приложение работает, можете проверить.
Вот несколько проблем, с которыми я столкнулся:
Рассмотрим пока первую проблему.
Взаимодействие с сервером — ключевой момент этого приложения. Когда приложение отправляет запрос на сервер, ему приходится ждать ответа. Во время этого ожидания пользовательский интерфейс останавливается и создается впечатление, что программа подвисла. Нестрашно, если ответ получен в течении секунды, но в реальности, ждать ответа от сервера иногда приходится около 10 секунд. Чтобы сообщить пользователю, что приложение не зависло, необходимо показать ему ProgressBar. Я остановился на крутящемся колесике, как в AJAX. Вот как это выглядит:

Опишу примерно как это работает. У меня есть некий класс HttpClient, он отвечает за взаимодействие с сервером. Он же запускает и останавливает ProgressBar. Работает этот класс асинхронно. То есть приложение, запустив его не ждет пока он отработает, а может продолжать свою работу. Достигается это следующей конструкцией:
Родительский класс, который вызывает HttpClient выглядит примерно так:
То что я пошел по пути Runnable — мне кажется очень спорным, но на тот момент не было других мыслей.
А вот асинхронно загружать и показывать картинки я научился по этой статье: habrahabr.ru/blogs/android/78747 пользуюсь моментом сказать спасибо rude!
В процессе создания своего приложения я столкнулся с несколькими трудностями, о решении которых и хочу поведать. Думаю, они будут полезны, таким же как я, новичкам, и буду благодарен за советы и более красивые примеры от гуру.
Но главное подтверждение работоспособности примеров — это то что приложение работает, можете проверить.
Вот несколько проблем, с которыми я столкнулся:
- UI ждет пока придет ответ от сервера, как победить? (в этой статье)
- Отправка и получение данных — в каком формате? (в следующей, если кому интересно)
- Как работать с камерой? (тоже в следующей, если кому интересно)
Рассмотрим пока первую проблему.
UI ждет пока придет ответ от сервера, как победить?
Взаимодействие с сервером — ключевой момент этого приложения. Когда приложение отправляет запрос на сервер, ему приходится ждать ответа. Во время этого ожидания пользовательский интерфейс останавливается и создается впечатление, что программа подвисла. Нестрашно, если ответ получен в течении секунды, но в реальности, ждать ответа от сервера иногда приходится около 10 секунд. Чтобы сообщить пользователю, что приложение не зависло, необходимо показать ему ProgressBar. Я остановился на крутящемся колесике, как в AJAX. Вот как это выглядит:

Опишу примерно как это работает. У меня есть некий класс HttpClient, он отвечает за взаимодействие с сервером. Он же запускает и останавливает ProgressBar. Работает этот класс асинхронно. То есть приложение, запустив его не ждет пока он отработает, а может продолжать свою работу. Достигается это следующей конструкцией:
// объявляем класс
public class HttpClient extends AsyncTask<Void, Integer, Long>{
...
// объявляем диалог
public ProgressDialog dialog;
// контекст родительского класса
Context ctx;
...
// запускаем ProgressBar в момент запуска потока
protected void onPreExecute() {
dialog = new ProgressDialog(ctx);
dialog.setMessage("Поиск...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
// сама работа потока, SendHttpPost() - наш долгоработающий метод
protected Long doInBackground(Void... params) {
try {
response = SendHttpPost();
} catch (Exception e) {
e.printStackTrace();
response = null;
}
return null;
}
// как только получили ответ от сервера, выключаем ProgressBar
protected void onPostExecute(Long unused) {
dialog.dismiss();
...
// тут можно сообщить родительскому классу, что мы закончили
// я делаю это немножко криво:
((Runnable)ctx).run();
....
super.onPostExecute(unused);
}
....
}
Родительский класс, который вызывает HttpClient выглядит примерно так:
public class SearchableActivity extends ListActivity implements Runnable {
private HttpClient req;
...
// этот медот вызывается, когда необходимо получить данные от сервера
private void showResults(String query) {
...
req = new HttpClient();
req.execute((Void)null);
}
// этот метод вызывается из HttpClient, когда ответ от сервера получен и можно что-то с ним делать
public void run() {
...
// делаем с req то что нам нужно, если надо перерисовываем Activity
...
}
}
То что я пошел по пути Runnable — мне кажется очень спорным, но на тот момент не было других мыслей.
А вот асинхронно загружать и показывать картинки я научился по этой статье: habrahabr.ru/blogs/android/78747 пользуюсь моментом сказать спасибо rude!