Еще один неудобный момент в нашей предыдущей версии был в том, что для того чтобы увидеть полученные данные по окончании обмена, пользователю приходилось переоткрывать программу. Давайте добавим наблюдатель за процедурой обмена, который будет реагировать на окончание успешного обмена:
- удалит из локальной базы все завершенные задачи
- заново перечитает задачи в список
Добавьте следующий код в MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | /* * Наблюдатель за процедурой обмена, расширим базовый из * FbaDBExchangeActivity */ private class MyExchangeObserver extends WSSimpleExchangeObserver { public MyExchangeObserver(FbaActivity activity, Handler handler) { super(activity, handler); } @Override public void onFinish(boolean success) { super.onFinish(success); if (success) { // Здесь вызов в отдельном потоке обязателен, если обновляются // визуальные элементы getHandler().post(new Runnable() { @Override public void run() { try { onFinishEchangeSuccess(); } catch (SQLException e) { e.printStackTrace(); } } }); } } } public void onFinishEchangeSuccess() throws SQLException { // создать менеджер для работы с таблицей задач ExTableTasksDao dao = getHelper().getDao(ExTableTasks.class); // удалить из локальной базы выполненные задачи DeleteBuilder<ExTableTasks, String> delBuilder = dao.deleteBuilder(); delBuilder.where().eq(ExTableTasks.FIELD_NAME_COMPLETE, true); dao.delete(delBuilder.prepare()); // перечитать данные list.setAdapter(createAdapter()); } |
/* * Наблюдатель за процедурой обмена, расширим базовый из * FbaDBExchangeActivity */ private class MyExchangeObserver extends WSSimpleExchangeObserver { public MyExchangeObserver(FbaActivity activity, Handler handler) { super(activity, handler); } @Override public void onFinish(boolean success) { super.onFinish(success); if (success) { // Здесь вызов в отдельном потоке обязателен, если обновляются // визуальные элементы getHandler().post(new Runnable() { @Override public void run() { try { onFinishEchangeSuccess(); } catch (SQLException e) { e.printStackTrace(); } } }); } } } public void onFinishEchangeSuccess() throws SQLException { // создать менеджер для работы с таблицей задач ExTableTasksDao dao = getHelper().getDao(ExTableTasks.class); // удалить из локальной базы выполненные задачи DeleteBuilder<ExTableTasks, String> delBuilder = dao.deleteBuilder(); delBuilder.where().eq(ExTableTasks.FIELD_NAME_COMPLETE, true); dao.delete(delBuilder.prepare()); // перечитать данные list.setAdapter(createAdapter()); }
Процедуру getExchangeObserver измените на:
1 2 3 4 | @Override protected ExchangeObserver getExchangeObserver() { return new MyExchangeObserver(this, new Handler()); } |
@Override protected ExchangeObserver getExchangeObserver() { return new MyExchangeObserver(this, new Handler()); }
Весь код из метода init() кроме инициализации вынести в отдельный метод createAdapter, теперь метод init() выглядит так:
1 2 3 4 | private void init() throws SQLException { list = (ListView) findViewById(R.id.listView1); list.setAdapter(createAdapter()); } |
private void init() throws SQLException { list = (ListView) findViewById(R.id.listView1); list.setAdapter(createAdapter()); }
Внесенные изменения оформим как новую версию программы, откройте AndroidManifest.xml и увеличьте номер версии вашего приложения:
1 2 | android:versionCode="2" android:versionName="1.01" |
android:versionCode="2" android:versionName="1.01"
Также можно убрать неиспользуемые разрешения, удалите следующие строки:
1 2 3 4 5 | <!-- Если используются карты и определение координат по GPS и данным сотовой сети --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> |
<!-- Если используются карты и определение координат по GPS и данным сотовой сети --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
В этом примере не используется функционал определения текущего местоположения пользователя, ни к чему лишние вопросы от пользователей, обеспокоенных сохранением своей «privacy»
Сохраните полученный apk как новую версию программы в справочнике «Версии мобильных приложений» и установите ее как рабочую для вашего приложения.
Запустите на эмуляторе первую версию и выполните обмен данными, в процессе обмена будет получена новая версия программы. При запуске приложение предложит обновиться.
В зависимости от настроек, пользователь или может продолжить работать на старой версии, или обязан будет обновиться (по умолчанию, см. файл AppSettings.java, метод isForceUpdateApp)