Android. Программирование для профессионалов. 4-е издание


Листинг 25.15. Обработка сообщения (ThumbnailDownloader.kt)



Download 21,53 Mb.
Pdf ko'rish
bet415/485
Sana13.07.2022
Hajmi21,53 Mb.
#787165
1   ...   411   412   413   414   415   416   417   418   ...   485
Bog'liq
Android Programmirovanie dlya professionalov 4-e izdanie 2020 Fillips Styuart Marsikano Gardner


20sp
3dp
name="AppTheme"
parent="
Theme.AppCompat.Light.DarkActionBar
">
name="colorPrimary">@color/colorPrimary
name="colorPrimaryDark">@color/colorPrimaryDark

name="colorAccent">@color/colorAccent
name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">

 
 
 
 
 
 
 
 

name="android:background">@color/dark_blue
m>

name="android:background">@color/dark_bluem>

bold

name="android:background">@color/dark_bluem>
name="StrongBeatBoxButton"
parent="@style/BeatBoxButton">
bold

name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
...

name="android:background">@color/dark_bluem>
name="AppTheme"
parent="Theme.AppCompat
.Light.DarkActionBar
">
...
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/
colorPrimaryred<
/item>
name="colorPrimaryDark">@color/
colorPrimary
Darkdark_red

name="colorAccent">@color/
colorAccentgrayitem>
name="Theme.AppCompat"
parent="Base.Theme.AppCompat" />
Тема 
Theme.AppCompat
наследует 
атрибуты 
от
Base.Theme.AppCompat
. Интересно, что 
Theme.AppCompat
не
переопределяет никакие атрибуты, а только содержит ссылку
на своего родителя.
Щелкните мышью по 
Base.Theme.AppCompat
с нажатой
клавишей (
Ctrl
). Android Studio сообщит, что тема уточняется
по ресурсам. Существует несколько разных версий этой темы в
зависимости от используемой версии Android.
name="Base.Theme.AppCompat"
parent="Base.V7.Theme.AppCompat">
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">

androidx.appcompat.app.AppCompatVie
wInflater

false

true

name="windowActionBarOverlay">false
name="Platform.AppCompat"
parent="android:Theme.Holo">
name="android:windowNoTitle">true
name="android:windowActionBar">false
?
attr/buttonBarStyle

?
attr/buttonBarButtonStyle
name="android:borderlessButtonStyle">?
attr/borderlessButtonStyle

...
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
...
name="android:windowBackground">@color/backgrou
nd_material_dark

name="AppTheme"
parent="Theme.AppCompat">
@color/red
name="colorPrimaryDark">@color/dark_red
@color/gray
 
 
 
 

name="android:windowBackground">@color/soothing
_blue
name="Base.V7.Theme.AppCompat"
parent="Platform.AppCompat">
...
name="buttonStyle">@style/Widget.AppCompat.Butt
on

name="buttonStyleSmall">@style/Widget.AppCompat
.Button.Small

...
name="Widget.AppCompat.Button"
parent="Base.Widget.AppCompat.Button"/>
Стиль 
Widget.AppCompat.Button
самостоятельно никакие
атрибуты не определяет. Чтобы просмотреть его содержимое,
перейдите к его родителю. Вы увидите, что базовый стиль
существует 
в 
двух 
версиях. 
Выберите 
версию
values/values.xml
.
name="Base.Widget.AppCompat.Button"
parent="android:Widget">
name="android:background">@drawable/abc_btn_def
ault_mtrl_shape

?
android:attr/textAppearanceButton

48dip
88dip
true
true
name="android:gravity">center_vertical|center_h
orizontal

name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red

name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@color/dark_bluem>

name="android:textStyle">bold
name="AppTheme"
parent="Theme.AppCompat">
name="colorPrimary">@color/red
name="colorPrimaryDark">@color/dark_red
name="colorAccent">@color/gray
name="android:windowBackground">@color/soothing
_blue

name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@color/dark_bluem>
name="Platform.AppCompat"
parent="android:Theme.Holo">
...
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="AppTheme"
parent="Theme.AppCompat">
...
name="BeatBoxButton"
parent="Widget.AppCompat.Button">
name="android:background">@drawable/button_beat
_box_normal

 
 
 
 
 
 
 
 

name="android:background">@drawable/button_beat
_box

Листинг 25.15. Обработка сообщения (ThumbnailDownloader.kt)
class ThumbnailDownloader
: HandlerThread(TAG), LifecycleObserver {
...
private 
val 
requestMap 
=
ConcurrentHashMap()
private val flickrFetchr = FlickrFetchr()


@Suppress("UNCHECKED_CAST")
@SuppressLint("HandlerLeak")
override fun onLooperPrepared() {
requestHandler = object : Handler() {
override fun handleMessage(msg:
Message) {
if (msg.what ==
MESSAGE_DOWNLOAD) {
val target = msg.obj as T
Log.i(TAG, "Got a request
for URL: ${requestMap[target]}")
handleRequest(target)
}
}
}
}
...
fun queueThumbnail(target: T, url: String)
{
...
}
private fun handleRequest(target: T) {
val url = requestMap[target] ?: return
 
 
 
 
 
 
 
 
val 
bitmap 
=
flickrFetchr.fetchPhoto(url) ?: return
}
}
При импорте библиотеки 
Message
обязательно выберите из
предложенных опций 
android.os.Message
.


Функция 
Handler.handleMessage(...)
реализуется в
подклассе 
Handler
внутри 
onLooperPrepared()
. Функция
HandlerThread.onLooperPrepared()
вызывается до того,
как 
Looper
впервые проверит очередь, поэтому она хорошо
подходит для создания реализации 
Handler
.
В коде 
Handler.handleMessage(...)
мы проверяем тип
сообщения, читаем значение 
obj
(которое имеет тип 
T
и
служит идентификатором для запроса) и передаем его функции
handleRequest(...)

(Вспомните, 
что
Handler.handleMessage(...)
будет вызываться, когда
сообщение загрузки извлечено из очереди и готово к
обработке.)
Вся загрузка осуществляется в функции 
handleRequest()
.
Мы проверяем существование URL-адреса, после чего передаем
его новому экземпляру знакомого класса 
FlickrFetchr
. При
этом 
используется 
функция
FlickrFetchr.getUrlBytes(...)

которую 
мы 
так
предусмотрительно создали в этой главе.
Аннотация 
@Suppress("UNCHECKED_CAST")
при проверке
сообщает Lint, что вы приводите 
msg.obj
к типу 
T
без
предварительной проверки того, относится ли 
msg.obj
к этому
типу на самом деле. Это нормально, потому что вы
единственный разработчик, работающий с кодом PhotoGallery.
Вы сами управляете сообщениями, добавленными в очередь, и
знаете, что на данный момент все сообщения в очереди имеют
объектное поле, установленное в экземпляр 
PhotoHolder
(которое 
соответствует 
T

указанному 
в
ThumbnailDownloader
).
Реализация обработчика, описанная выше, технически
создает внутренний класс. Внутренние классы содержат ссылку
на 
свой 
внешний 
класс 
(в 
данном 
случае


ThumbnailDownloader
), что в свою очередь может привести к
утечке внешнего класса, если время жизни внутреннего класса
больше, чем предполагаемое время жизни внешнего класса.
Проблемы тут получаются только в том случае, если
обработчик прикреплен к объекту 
Looper
основного потока.
Предупреждение 
HandlerLeak
убирается 
аннотацией
@SuppressLint("HandlerLeak")
, так как создаваемый
обработчик прикреплен к 
looper
фонового потока. Если
вместо этого обработчик был прикреплен к 
looper
основного
потока, то он может и не собирать мусор. Если бы произошла
утечка, 
так 
как 
он 
также 
содержит 
ссылку 
на
ThumbnailDownloader
, ваше приложение также утеряло бы
экземпляр 
ThumbnailDownloader
.
Блокировать предупреждения Lint нужно только в том
случае, если вы действительно понимаете, откуда взялось
предупреждение и почему его блокирование в данном
сценарии безопасно.
Запустите приложение PhotoGallery и проверьте на панели
LogCat
ваши подтверждающие команды регистрации.
Разумеется, запрос не будет полностью обработан до
момента назначения изображения в объекте 
PhotoHolder
,
поступившем от 
PhotoAdapter
. Однако эта операция
относится к пользовательскому интерфейсу, поэтому она
должна выполняться в главном потоке.
До 
настоящего 
момента 
мы 
ограничивались
использованием обработчиков и сообщений в одном потоке —
помещением сообщений в собственный почтовый ящик
ThumbnailDownloader
. В следующем разделе вы увидите, как
ThumbnailDownloader
использует 
Handler
для отправки
запросов главному потоку.



Download 21,53 Mb.

Do'stlaringiz bilan baham:
1   ...   411   412   413   414   415   416   417   418   ...   485




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish