SlideShare a Scribd company logo
Клиент-серверное
взаимодействие под Android
        в деталях


                    Кирилл Зотин
                       Android dev lead
                            23.04.2011
Введение
• Специфика мобильных приложений:
      Document-ориентированая модель
                  VS
      Database-ориентированная модель

• Преимущества родных приложений над
  мобильными версиями сайтов
Document-ориентированая
     модель данных
Database-ориентированная
     модель данных
Преимущества над мобильными
          версиями сайтов.
•   Тесная интеграция с платформой
•   Улучшение поведения платформы
•   Фоновая работа
•   Более высокая скорость работы
•   "родной" пользовательский интерфейс
Типичная реализация
О проблеме
• OS в любой момент может
  остановить процесс
• Данные не всегда
  сохранены
Правильная реализация1:
      Service API
Правильная реализация2:
  Content Provider API
Network-MVC
Правильная реализация3:
Content Provider + SyncAdapter
Tips & Tricks
•   Выполняйте запросы к БД не в UI потоке
•   Используйте транзакции
•   Делайте код хорошо читаемым
•   Используйте Gzip сжатие
•   Android 3.0: Loaders
•   Удобный класс IntentService
Выполняйте запросы к БД
                 не в UI потоке
• Используйте (Notifying)AsyncQueryHandler
public class YourActivity extends Activity implements AsyncQueryListener {

    @Override
    public void onQueryComplete(int token, Object cookie,
            final Cursor cursor) {
        startManagingCursor(cursor);
        . . .
    }
}
Используйте транзакции
@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
        throws OperationApplicationException {
    final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
    db.beginTransaction();
    try {
        final int numOperations = operations.size();
        final ContentProviderResult[] results = new ContentProviderResult[numOperations];
        for (int i = 0; i < numOperations; i++) {
            results[i] = operations.get(i).apply(this, results, i);
        }
        db.setTransactionSuccessful();
        return results;
    } finally {
        db.endTransaction();
    }
Группируйте детали запросов
                  в одном месте
Плохо                                                     Хорошо
Cursor mCursor = query(true,                              interface ReviewsQuery {
    DATABASE_TABLE_EMAIL,                                     final String[] PROJECTION = new String[] {
                                                                      Reviews._ID,
    new String[] {                                                    Reviews.TITLE,
        KEY_ROWID, KEY_EMAIL_NAME                                     Reviews.SUBTITLE,
    },                                                                Reviews.IMG_URL_SMALL,
    KEY_ROWID + "=" + rowId,                                          Reviews.ARTICLE_ID
    null, null, null, null, null);                                };
                                                              int ID = 0;
                                                              int TITLE = 1;
if (mCursor.moveToFirst()) {                                  int SUBTITLE = 2;
    long id = mCursor.getLong(                                int IMG_URL = 3;
        mCursor.getColumnIndexOrThrow(KEY_ROWID));            int ARTICLE_ID = 4;
    String name = mCursor.getString(
                                                              String DEFAULT_SORT = Reviews.DATE + " desc";
        mCursor.getColumnIndexOrThrow(KEY_EMAIL_NAME));   }
}                                                         ...
                                                          startAsyncQuery(QUERY_REVIEWS_ITEMS, null,
                                                                  Reviews.CONTENT_URI,
                                                                  ReviewsQuery.PROJECTION,
                                                                  selection, null,
                                                                  ReviewsQuery.DEFAULT_SORT);
                                                          …
                                                          final String url =
                                                               getCursor().getString(ReviewsQuery.IMG_URL);
Используйте сжатие Gzip
HttpGet request = new HttpGet(uri);
request.addHeader("Accept-Encoding", "gzip");

HttpResponse response = getHttpClient().execute(request);
Header contentEncoding = response.getFirstHeader("Content-Encoding");

if (contentEncoding != null &&
    contentEncoding.getValue().equalsIgnoreCase("gzip")) {
    is = new GZIPInputStream(is);
}
Honeycomb API: CursorLoader
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    getLoaderManager().initLoader(0, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    final String eventId = getArguments().getString(EXTRA_EVENT_ID);
    return new CursorLoader(getActivity(),
            Events.CONTENT_URI,
            EventQuery.PROJECTION,
            EventQuery.SELECTION, new String[] {eventId}, null);
}
Использование IntentService
• Для обработки Intent стартует Service
• Запрос обрабатывается в отдельном потоке
• Параллельные запросы кладутся в одну
  очередь.
Выводы
• Не обрабатывайте сетевые операции в
  Activity, используйте Service
• Сохраняйте данные часто
• Все запросы к БД – в отдельный поток
• Минимизируйте трафик сетевых операций
• Используйте локальный кэш данных
Спасибо за внимание

          • kzotin@gmail.com
          • Skype: kzotin

More Related Content

PDF
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
PPTX
Mikhail Valkov_Antipatterns
PDF
Kvc, kvo
PDF
Влад Ковташ — Yap Database
PDF
Клиент-серверное взаимодействие под android в деталях
PPTX
Основы Java. 5. Databases
PPT
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
PPT
Yii development
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
Mikhail Valkov_Antipatterns
Kvc, kvo
Влад Ковташ — Yap Database
Клиент-серверное взаимодействие под android в деталях
Основы Java. 5. Databases
Шаблоны разработки ПО. Часть 3. Шаблоны GoF
Yii development

What's hot (19)

PPTX
Реализация шаблонов корпоративных приложений в Magento
PDF
Перспективы функционального подхода
PPT
Javascript
PPTX
Java осень 2012 лекция 8
PDF
Лекция #5. Введение в язык программирования Python 3
PPTX
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
PDF
Survive with OOP
PDF
Java осень 2014 занятие 7
PPTX
Bytecode
PPT
Подробная презентация JavaScript 6 в 1
PDF
Python dict: прошлое, настоящее, будущее
KEY
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
PPTX
Индексирование в Magento
PPT
Agile Instrumentation
PDF
msumobi2. Лекция 2
PDF
Магия метаклассов
PPTX
C#. От основ к эффективному коду
PPTX
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
PPTX
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Реализация шаблонов корпоративных приложений в Magento
Перспективы функционального подхода
Javascript
Java осень 2012 лекция 8
Лекция #5. Введение в язык программирования Python 3
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Survive with OOP
Java осень 2014 занятие 7
Bytecode
Подробная презентация JavaScript 6 в 1
Python dict: прошлое, настоящее, будущее
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Индексирование в Magento
Agile Instrumentation
msumobi2. Лекция 2
Магия метаклассов
C#. От основ к эффективному коду
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Ad

Viewers also liked (8)

PDF
Taras Kalapun ui testing
PDF
Winactie kleurplaten
PPTX
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
PDF
Pavel kravchenko obj c runtime
PDF
Dmitry pilipenko i os gamekit
PPTX
Time management training (Vadim Tikanov Ciklum)
PPT
Alfa times 1
PDF
Segey Glebov tips and tricks for modern mobile project management
Taras Kalapun ui testing
Winactie kleurplaten
05 net saturday vasiliy borovyak ''.net performance nontrivial bottlenecks''
Pavel kravchenko obj c runtime
Dmitry pilipenko i os gamekit
Time management training (Vadim Tikanov Ciklum)
Alfa times 1
Segey Glebov tips and tricks for modern mobile project management
Ad

More from DneprCiklumEvents (11)

PPTX
Convert estimates to plans (Maxym Mykhalchuk Ciklum)
PPT
Vladimir kozhayev handmade isometry
ODP
Pavel yuriychuk svg in game development
PDF
Vitaly hit' abc_of_game_development
PPTX
04 net saturday eugene sukhikh ''the basic performance questions''
PPTX
04 net saturday eugene sukhikh ''the basic performance questions''
PPTX
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
PPTX
03 net saturday anton samarskyy ''document oriented databases for the .net pl...
PPTX
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
PPTX
01 net saturday alex krakovetskiy ''asp.net scaffolding''
PDF
Sergey Khlopenov tools for_development_cross_platform_mobile_ap
Convert estimates to plans (Maxym Mykhalchuk Ciklum)
Vladimir kozhayev handmade isometry
Pavel yuriychuk svg in game development
Vitaly hit' abc_of_game_development
04 net saturday eugene sukhikh ''the basic performance questions''
04 net saturday eugene sukhikh ''the basic performance questions''
06 net saturday eugene zharkov ''silverlight. to oob or not to oob''
03 net saturday anton samarskyy ''document oriented databases for the .net pl...
02 net saturday roman gomolko ''mvvm in javascript using knockoutjs''
01 net saturday alex krakovetskiy ''asp.net scaffolding''
Sergey Khlopenov tools for_development_cross_platform_mobile_ap

Kirill Zotin клиент серверное взаимодействие под android в деталях

  • 1. Клиент-серверное взаимодействие под Android в деталях Кирилл Зотин Android dev lead 23.04.2011
  • 2. Введение • Специфика мобильных приложений: Document-ориентированая модель VS Database-ориентированная модель • Преимущества родных приложений над мобильными версиями сайтов
  • 3. Document-ориентированая модель данных
  • 4. Database-ориентированная модель данных
  • 5. Преимущества над мобильными версиями сайтов. • Тесная интеграция с платформой • Улучшение поведения платформы • Фоновая работа • Более высокая скорость работы • "родной" пользовательский интерфейс
  • 7. О проблеме • OS в любой момент может остановить процесс • Данные не всегда сохранены
  • 12. Tips & Tricks • Выполняйте запросы к БД не в UI потоке • Используйте транзакции • Делайте код хорошо читаемым • Используйте Gzip сжатие • Android 3.0: Loaders • Удобный класс IntentService
  • 13. Выполняйте запросы к БД не в UI потоке • Используйте (Notifying)AsyncQueryHandler public class YourActivity extends Activity implements AsyncQueryListener { @Override public void onQueryComplete(int token, Object cookie, final Cursor cursor) { startManagingCursor(cursor); . . . } }
  • 14. Используйте транзакции @Override public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws OperationApplicationException { final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase(); db.beginTransaction(); try { final int numOperations = operations.size(); final ContentProviderResult[] results = new ContentProviderResult[numOperations]; for (int i = 0; i < numOperations; i++) { results[i] = operations.get(i).apply(this, results, i); } db.setTransactionSuccessful(); return results; } finally { db.endTransaction(); }
  • 15. Группируйте детали запросов в одном месте Плохо Хорошо Cursor mCursor = query(true, interface ReviewsQuery { DATABASE_TABLE_EMAIL, final String[] PROJECTION = new String[] { Reviews._ID, new String[] { Reviews.TITLE, KEY_ROWID, KEY_EMAIL_NAME Reviews.SUBTITLE, }, Reviews.IMG_URL_SMALL, KEY_ROWID + "=" + rowId, Reviews.ARTICLE_ID null, null, null, null, null); }; int ID = 0; int TITLE = 1; if (mCursor.moveToFirst()) { int SUBTITLE = 2; long id = mCursor.getLong( int IMG_URL = 3; mCursor.getColumnIndexOrThrow(KEY_ROWID)); int ARTICLE_ID = 4; String name = mCursor.getString( String DEFAULT_SORT = Reviews.DATE + " desc"; mCursor.getColumnIndexOrThrow(KEY_EMAIL_NAME)); } } ... startAsyncQuery(QUERY_REVIEWS_ITEMS, null, Reviews.CONTENT_URI, ReviewsQuery.PROJECTION, selection, null, ReviewsQuery.DEFAULT_SORT); … final String url = getCursor().getString(ReviewsQuery.IMG_URL);
  • 16. Используйте сжатие Gzip HttpGet request = new HttpGet(uri); request.addHeader("Accept-Encoding", "gzip"); HttpResponse response = getHttpClient().execute(request); Header contentEncoding = response.getFirstHeader("Content-Encoding"); if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) { is = new GZIPInputStream(is); }
  • 17. Honeycomb API: CursorLoader @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(0, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { final String eventId = getArguments().getString(EXTRA_EVENT_ID); return new CursorLoader(getActivity(), Events.CONTENT_URI, EventQuery.PROJECTION, EventQuery.SELECTION, new String[] {eventId}, null); }
  • 18. Использование IntentService • Для обработки Intent стартует Service • Запрос обрабатывается в отдельном потоке • Параллельные запросы кладутся в одну очередь.
  • 19. Выводы • Не обрабатывайте сетевые операции в Activity, используйте Service • Сохраняйте данные часто • Все запросы к БД – в отдельный поток • Минимизируйте трафик сетевых операций • Используйте локальный кэш данных
  • 20. Спасибо за внимание • kzotin@gmail.com • Skype: kzotin