2014-12-27 1 views
0

Я хочу передать Asset из своего приложения в его приложение для ношения.Android app app - методы блокировки в потоке пользовательского интерфейса

Пример кода можно найти здесь: https://developer.android.com/training/wearables/data-layer/assets.html

Однако, я вижу 2 способа блокировки называют, и кажется, что они сделаны в основном потоке:

ConnectionResult result = 
     mGoogleApiClient.blockingConnect(TIMEOUT_MS, TimeUnit.MILLISECONDS); 

И

InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
     mGoogleApiClient, asset).await().getInputStream(); 

Можно ли назвать эти методы в потоке пользовательского интерфейса? Или я должен переместить этот кусок кода в фоновый поток?

ответ

0

Нет, это нехорошо назвать эти методы в потоке пользовательского интерфейса. Фактически, вызывая await() на любом PendingResult (например, то, что возвращает getFdForAsset()), в потоке пользовательского интерфейса сразу же возникает исключение.

Вместо этого каждый метод имеет эквивалентный механизм обратного вызова - для входа в систему, это стандарт ConnectionCallbacks зарегистрирован с помощью registerConnectionCallbacks или для PendingResult это ResultCallback устанавливается с помощью метода setResultCallback().

Конечно, вы можете использовать любой способ для создания separate threads - простейшим из них является AsyncTask, а затем запустить все эти методы в фоновом потоке, а не в потоке пользовательского интерфейса.

+1

Спасибо за ваш комментарий. На самом деле я не получаю сбой при вызове wait(), и я убедился, что работает в потоке пользовательского интерфейса. Кроме того, мне очень странно, что google опубликует такой пример кода и не упоминает, что требуется работа с потоками. – dors

+0

Вы уверены, что вы говорите также верно для кода, работающего на устройствах Wear? – dors

+1

Во многих случаях вы извлекали активы в свой [WearableListenerService] (http://developer.android.com/reference/com/google/android/gms/wearable/WearableListenerService.html), который использует все свои методы (в том числе метод onDataChanged() в примере) уже на фоновом потоке. – ianhanniballake

Смежные вопросы