Задачи для мобильного сотрудника (часть 2)

Еще один неудобный момент в нашей предыдущей версии был в том, что для того чтобы увидеть полученные данные по окончании обмена, пользователю приходилось переоткрывать программу. Давайте добавим наблюдатель за процедурой обмена, который будет реагировать на окончание успешного обмена:

- удалит из локальной базы все завершенные задачи
- заново перечитает задачи в список

Добавьте следующий код в 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)

Похожие записи: