Нативная разработка мобильных приложений



Download 3,69 Mb.
Pdf ko'rish
bet99/228
Sana21.07.2022
Hajmi3,69 Mb.
#834838
1   ...   95   96   97   98   99   100   101   102   ...   228
Bog'liq
Нативная разработка мобильных приложений

но это 
поведение никак не гарантируется
. Мы можем надеяться, что авторы библиоте
-
ки 
Downloader
реализовали это соглашение, но не можем быть в этом уверены, 
а это значит, что подобные задачи мы должны решать самостоятельно. И сно
-
ва используем в качестве примера загрузку файла: вы можете проверять 
isIn­
terrupted
в каждой итерации цикла 
InputStream.read
/
OutputStream.write
. Напри
-
мер, обратимся к простому методу загрузки в классе 
Networking
, описанному 
в следующей главе, и изменим его, добавив возможность отмены:
Java
public class Networking {
public static void downloadBinaryData(Context context) throws Exception {
File file = new File(context.getFilesDir(), "downloaded-image.png");
FileOutputStream fileOutputStream = new FileOutputStream(file);
URL url = new URL("http://moagrius.com/assets/images/hero-trips.png");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int data;
while ((data = connection.getInputStream().read()) != -1) {
// сгенерировать исключение при прерывании операции загрузки
if (Thread.currentThread().isInterrupted()) {
throw new InterruptedException("Download cancelled!");
}
fileOutputStream.write(data);
}
fileOutputStream.flush();
}
}


Android 

147
Kotlin
fun downloadBinaryData(context: Context) {
val file = File(context.filesDir, "downloaded-image.png")
val fileOutputStream = FileOutputStream(file)
val url = URL("http://moagrius.com/assets/images/hero­trips.png")
val connection = url.openConnection() as HttpURLConnection
var data = connection.inputStream.read()
while (data != -1) {
// сгенерировать исключение при прерывании операции загрузки
if (Thread.currentThread().isInterrupted) {
throw InterruptedException("Download cancelled!")
}
fileOutputStream.write(data)
data = connection.inputStream.read()
}
fileOutputStream.flush()
}
В блоке 
try
/
catch
, где вызывается 
downloadBinaryData
, вы, вероятно, захотите 
удалить частично загруженный файл и обновить пользовательский интерфейс, 
чтобы скрыть компонент, отображающий прогресс загрузки, или показать со
-
общение пользователю. Возможно, вы также захотите вызвать метод 
cancel
, ко
-
торый, в свою очередь, вызовет 
Thread.interrupt()
фонового потока. Вот как это 
могло бы выглядеть в коде (с учетом особенностей Android):
Java
public class MainAc ti vi ty extends Ac ti vi ty {
private Thread mBackgroundThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // имеется представление с кнопкой
Button button = findViewById(R.id.button);
button.setOnClickListener(this::clickHandler);
}
public void clickHandler(View view) {
if (mBackgroundThread != null) {
cancel();
} else {
downloadInBackground();
}
}
public void downloadInBackground() {
mBackgroundThread = new Thread(() ­> {
try {
downloadBinaryData();
} catch (Exception e) {
Log.d("MyTag", "cancelled!");
} finally {


148

Конкурентное (многопоточное) выполнение
mBackgroundThread = null;
}
});
mBackgroundThread.start();
}
public void cancel() {
mBackgroundThread.interrupt();
}
private boolean assetDownloadIsNotCancelled() throws InterruptedException {
if (mBackgroundThread.isInterrupted()) {
throw new InterruptedException("Download cancelled!");
}
return true;
}
public void downloadBinaryData() throws Exception {
File file = new File(getFilesDir(), "downloaded-image.png");
if (file.exists()) {
file.delete();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
assetDownloadIsNotCancelled();
URL url = new URL("http://moagrius.com/assets/images/hero-trips.png");
assetDownloadIsNotCancelled();
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
assetDownloadIsNotCancelled();
InputStream inputStream = connection.getInputStream();
byte[] buffer = new byte[1024];
try {
while (assetDownloadIsNotCancelled()) {
int data = inputStream.read(buffer);
if (data == ­1) {
break; // EOF
}
fileOutputStream.write(buffer, 0, data);
fileOutputStream.flush();
}
} finally {
fileOutputStream.close();
inputStream.close();
}
}
}
Kotlin
class MainAc ti vi ty : Ac ti vi ty() {
private var backgroundThread: Thread? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) // имеется представление с кнопкой


Android 

149
val button = findViewById


150

Конкурентное (многопоточное) выполнение
break // EOF
}
fileOutputStream.write(buffer, 0, data)
fileOutputStream.flush()
}
} finally {
fileOutputStream.close()
inputStream.close()
}
}
}
Библиотека RxJava (
https://oreil.ly/HyJnl
) предлагает надежный API для парал
-
лельного выполнения операций со слоями абстракции, позволяющими отде
-
лить разрабатываемый код от опасностей низкоуровневого управления пото
-
ками. Она может оказаться хорошим инструментом для создания общей базы 
кода и отлично подходит для решения многих задач. Тем не менее, как это 
характерно для большинства абстракций, классы из стандартной библиотеки, 
такие как Thread, могут обеспечить более точное управление выполнением.
Класс 
AsyncTask
в Android позволяет запускать фоновые задания и посылать 
результаты в основной поток. Но имейте в виду, что этот класс имеет свои не
-
достатки. С одной стороны, в самых ранних версиях этот класс использовал 
несколько потоков из пула 
ThreadPoolExecutor
, позднее он был изменен и стал 
использовать один поток, но затем снова был изменен. Кроме того, рабочий 
метод 
AsyncTask
не имеет возможности выхода, если вдруг потребуется отме
-
нить задачу. В последнее время сообщество пришло к общему мнению, что 
AsyncTask
не представляет достаточной ценности, чтобы оправдать недостат
-
ки, – авторы книги считают, что почти во всех случаях более простым, надеж
-
ным и управляемым является подход на основе 
Thread
и 
post
, описанный выше.
Кроме того, многие из тем, затронутых в этой главе, очень подробно осве
-
щены в книге Андерса Ёранссона (Anders Göransson) «Efficient Android Thread
-
ing» (O’Reilly)
1
. И конечно же, по многим вопросам вам поможет книга Джошуа 
Блоха (Joshua Bloch) «Efficient Java» (O’Reilly)
2
.
iOS
Подходы к организации параллельных вычислений в iOS основываются на 
применении старых классических приемов, использовавшихся еще в языке C, 
и использовании модернизированного и интеллектуального механизма Grand 
Central Dispatch. В iOS доступны три основных варианта выполнения заданий 
в фоновом режиме: 
DispatchQueue

Operation
и 
Thread
.
Иногда можно использовать оба подхода сразу, но для целей этой главы мы 
сосредоточимся на Grand Central Dispatch и 
DispatchQueue
; они применяются 
1

Download 3,69 Mb.

Do'stlaringiz bilan baham:
1   ...   95   96   97   98   99   100   101   102   ...   228




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