0% menganggap dokumen ini bermanfaat (0 suara)
27 tayangan13 halaman

Bab 7. Background Tasks

Aplikasi ini membuat slot game dengan minimal 2 slot yang berjalan secara bersamaan menggunakan background tasks pada Android. Background tasks digunakan untuk menjalankan proses yang membutuhkan waktu lama seperti download gambar dari internet tanpa menghambat tampilan utama. Aplikasi ini mengambil data gambar dari API, menampilkannya pada 3 slot secara bersamaan, dan menampilkan hasilnya di layar.

Diunggah oleh

Hidayatus Syifa
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
27 tayangan13 halaman

Bab 7. Background Tasks

Aplikasi ini membuat slot game dengan minimal 2 slot yang berjalan secara bersamaan menggunakan background tasks pada Android. Background tasks digunakan untuk menjalankan proses yang membutuhkan waktu lama seperti download gambar dari internet tanpa menghambat tampilan utama. Aplikasi ini mengambil data gambar dari API, menampilkannya pada 3 slot secara bersamaan, dan menampilkan hasilnya di layar.

Diunggah oleh

Hidayatus Syifa
Hak Cipta
© © All Rights Reserved
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 13

BAB 7 BACKGROUND TASKS

7.1 TUJUAN PRAKTIKUM


a. Mampu membuat aplikasi slot game dengan minimal 2 slot berjalan bersama.

7.2 DASAR TEORI


1. Background Tasks
Background tasks adalah salah satu class dari android yang menjalankan perintah di
belakang atau background. Background tasks biasanya digunakan untuk menjalankan
perintah yang membutuhkan proses lama seperti proses download, upload, looping,
ataupun proses query ke database. Karena jika suatu perintah yang membutuhkan proses
lama di jalankan tanpa background tasks android, maka akan berakibat tampilan jadi
hang atau berhenti selama perintah itu masih berjalan, oleh karena itu background tasks
android mencegahnya dengan membuat perintah tersebut berjalan di
belakang/background sehingga tampilan di androidnya tidak terganggu. Secara umum
semua komponen aplikasi di Android berjalan pada proses dan thread yang sama. Ini
disebut main thread atau ui thread. Secara default ini berarti sistem Android tidak secara
otomatis menciptakan thread lain untuk menjalankan proses secara spesifik. Karena
dalam pengembangan aplikasi dibutuhkan proses komputasi yang intensif seperti proses
download, upload ataupun koneksi ke server. Jika proses tersebut dilakukan di ui
thread/main thread, maka akan menghambat rendering tampilan aplikasi, serta dapat
menyebabkan kondisi hang atau freeze. Oleh karena itu dibutuhkan thread lain yang
bernama background thread/background tasks yang bersifat asynchronous yang akan
berjalan pada thread yang terpisah dengan main thread.
Terdapat dua aturan yang harus diperhatikan agar tercipta pengalaman pengguna yang
baik ketika menerapkan proses komputasi intensif saat pengembangan aplikasi,
diantaranya:
a. Jangan memblok ui thread/main thread. Sehingga harus menggunakan background
thread yang bersifat asynchronous
b. Jangan melakukan pemanggilan komponen ui widget pada background thread

Thread Merupakan sekumpulan perintah atau instruksi yang dapat dieksekusi atau
dilaksanakan secara beriringan.

2. Handler
Handler merupakan fungsi yang dapat menyelesaikan masalah tentang background
thread gimana handler dapat mengirim dan memproses message dan objek runnable
lainnya yang berhubungan dengan thread. Handler akan terikat dengan thread dimana
handler tersebut diciptakan.

3. Executors
Executors merupakan inner class dari concurrent pada Java yang memiliki kemampuan
untuk manajemen banyak thread sekaligus baik dari segi penjadwalan maupun urutan
proses. Terdapat beberapa jenis executor yang digunakan untuk mengatur jumlah thread
yang dibuat.

a. newSingleThreadExecutor, digunakan jika ingin membuat satu thread saja. b.


newFixedThreadPool(nThreads), digunakan jika ingin membuat banyak thread dengan
memasukkan jumlah berat yang ingin dibuat pada parameter
c. newCachedThreadPool, digunakan jika ingin membuat thread sesuai dengan
kebutuhan, thread yang tidak dipakai selama 1 menit akan dihapus dari cache Terdapat
juga executor servis yang merupakan turunan dari executor dimana terdapat fitur
tambahan yang digunakan untuk memantau proses yang berjalan dengan menggunakan
fungsi submit yang menghasilkan Future.
7.3 Prosedur / Pelaksanaan Praktikum
1. Tambahkan kode berikut pada file build.gradle Module, didalam dependencies. Kemudian
tekan Sync Now.
implementation
'com.loopj.android:android-async-http:1.4.9'
implementation 'com.github.bumptech.glide:glide:4.12.0'

2. Pada file manifest, tambahkan permission internet dengan kode dibawah ini.
<uses-permission android:name="android.permission.INTERNET"
/>

3. Buat sebuah tampilan layout yang terdiri dari beberapa komponen view diantaranya
ImageView, Button, serta TextView. Kemudian atur sedemikian rupa menggunakan
ViewGroup. Source code layout seperti dibawah ini.
xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/andro
id" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".MainActivity">

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="50dp"
android:orientation="horizontal">

<ImageView
android:id="@+id/img_slot1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_weight="1"

android:src="@drawable/ic_launcher_background" />
<ImageView
android:id="@+id/img_slot2"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_weight="1"

android:src="@drawable/ic_launcher_background" />

<ImageView
android:id="@+id/img_slot3"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_weight="1"

android:src="@drawable/ic_launcher_background" />

</LinearLayout>

<Button
android:id="@+id/btn_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="Ambil gambar" />

<TextView
android:id="@+id/tv_hasil"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:scrollbarSize="16sp"
android:text="Hasil output"
android:textAlignment="center"
android:textColor="#000" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="800dp"
android:text="Batas Bawah" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

Hasil tampilan layout:


4. Pada file activity java lakukan inisialisasi variabel untuk view dan array list yang digunakan
untuk menampung hasil get data image. Serta lakukan viewBinding terhadap variabel
tersebut.
Java:
...
public class MainActivity extends AppCompatActivity {

private ImageView imgSlot1;


private ImageView imgSlot2;
private ImageView imgSlot3;
private Button btnGet;
private TextView tvHasil;
ArrayList<String> arrayUrl = new ArrayList<>();

@Override
protected void onCreate ...

btnGet = findViewById(R.id.btn_get);
imgSlot1 = findViewById(R.id.img_slot1);
imgSlot2 = findViewById(R.id.img_slot2);
imgSlot3 = findViewById(R.id.img_slot3);
tvHasil = findViewById(R.id.tv_hasil);
}
}
5. Inisialisasi ExecutorService serta Handler pada function onCreate.
Java:
...
@Override
protected void onCreate ...

ExecutorService execGetImage =
Executors.newSingleThreadExecutor();
Handler handler = new
Handler(Looper.getMainLooper()); ...

6. Selanjutnya buat function dengan nama loadStringFromNetwork yang memiliki return


serta parameter string, function ini digunakan untuk mengambil data lewat api /
network. Java:
...
private String loadStringFromNetwork(String s) throws
IOException {
final URL myUrl = new URL(s);
final InputStream in = myUrl.openStream();

final StringBuilder out = new StringBuilder();


final byte[] buffer = new byte[1024];

try {
for (int ctr; (ctr = in.read(buffer)) != -1; ) {
out.append(new String(buffer, 0, ctr)); }
} catch (IOException e) {
throw new RuntimeException("Gagal mendapatkan text", e);
}

final String yourFileAsAString = out.toString();


return yourFileAsAString;
}
...
7. Selanjutnya pada event click button get, tambahkan source code dibawah ini. Source code
ini digunakan untuk menjalankan fungsi loadStringFromNetwork, fetching data json, set
image dari hasil data ke ImageView dan setText hasil pada layout.
Java:
...
btnGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
execGetImage.execute(new Runnable() { @Override
public void run() {
try {
final String txt =
loadStringFromNetwork("https://mocki.io/v1/821f1b13-fa9a-4
3aa ba9a-9e328df8270e");
try {
JSONArray jsonArray = new JSONArray(txt);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);

arrayUrl.add(jsonObject.getString("url"));
}

} catch (JSONException e) { e.printStackTrace();


}
handler.post(new Runnable() {
@Override
public void run() {

Glide.with(MainActivity.this).load(arrayUrl.get(0
)) .into(imgSlot1);
Glide.with(MainActivity.this).load(arrayUrl.get(1
)) .into(imgSlot2);
Glide.with(MainActivity.this).load(arrayUrl.get(
2)) .into(imgSlot3);
tvHasil.setText(txt);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
...

8. Full source code dari activity sebagai berikut


Java:
package com.packagename;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MainActivity extends AppCompatActivity {

private ImageView imgSlot1;


private ImageView imgSlot2;
private ImageView imgSlot3;
private Button btnGet;
private TextView tvHasil;
ArrayList<String> arrayUrl = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnGet = findViewById(R.id.btn_get);
imgSlot1 = findViewById(R.id.img_slot1);
imgSlot2 = findViewById(R.id.img_slot2);
imgSlot3 = findViewById(R.id.img_slot3);
tvHasil = findViewById(R.id.tv_hasil);

ExecutorService execGetImage =
Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());

btnGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
execGetImage.execute(new Runnable() { @Override
public void run() {
try {
final String txt =
loadStringFromNetwork("https://mocki.io/v1/821f1b13-fa9a-43aa
ba9a-9e328df8270e");
try {
JSONArray jsonArray = new JSONArray(txt);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);

arrayUrl.add(jsonObject.getString("url"));
}

} catch (JSONException e) { e.printStackTrace(); }


handler.post(new Runnable() {
@Override
public void run() {

Glide.with(MainActivity.this)

.load(arrayUrl.get(0))
.into(imgSlot1);

Glide.with(MainActivity.this)

.load(arrayUrl.get(1))
.into(imgSlot2);
Glide.with(MainActivity.this)

.load(arrayUrl.get(2))
.into(imgSlot3); tvHasil.setText(txt); }
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
}
private String loadStringFromNetwork(String s) throws
IOException {
final URL myUrl = new URL(s);
final InputStream in = myUrl.openStream();

final StringBuilder out = new StringBuilder();


final byte[] buffer = new byte[1024];

try {
for (int ctr; (ctr = in.read(buffer)) != -1; ) {
out.append(new String(buffer, 0, ctr)); }
} catch (IOException e) {
throw new RuntimeException("Gagal mendapatkan text", e);
}

final String yourFileAsAString = out.toString();


return yourFileAsAString;
}
}

9. Hasil aplikasi ketika dijalankan


Tampilan awal aplikasi Tampilan setelah ditekan tombol
ambil gambar

7.4 Tugas Analisis Hasil Praktikum


1. Dari hasil tutorial pembuatan aplikasi slot game yang telah dipelajari sebelumnya pada
perkuliahan (https://youtu.be/KRFzB62J7lw), lakukan penggabungan antara project slot
game dengan project praktikum ini (tahapan Prosedur / Pelaksanaan
Praktikum).Sehingga akan didapatkan hasil aplikasi slot game namun dengan assets
gambar yang didapat dari hasil get data dari internet (link image assets :
"https://mocki.io/v1/821f1b13-fa9a-43aa ba9a-9e328df8270e").
2. Jelaskan perbedaan antara UI Thread / Main Thread dengan Background Thread

Anda mungkin juga menyukai