AsyncTask
Gunakan kelas AsyncTask untuk mengimplementasikan tugas asinkron yang berjalan
lama di thread pekerja. (Thread pekerja adalah thread yang bukan thread utama atau
thread UI.) AsyncTask memungkinkan Anda menjalankan operasi latar belakang dan
mempublikasikan hasil di thread UI tanpa memanipulasi thread atau penangan. Bila AsyncTask dieksekusi, maka akan melalui empat langkah:
1. onPreExecute( ) dipanggil di thread UI sebelum tugas dieksekusi. Langkah ini
biasanya digunakan untuk mempersiapkan tugas, misalnya dengan menampilkan
bilah kemajuan di UI.
2. doInBackground( Params. . . ) dipanggil pada thread latar belakang segera setelah
onPreExecute( ) selesai. Langkah ini menjalankan komputasi latar belakang,
mengembalikan hasil, dan meneruskan hasilnya ke onPostExecute( ) . Metode
doInBackground( ) juga bisa memanggil publishProgress( Progress. . . ) untuk
mempublikasikan satu atau beberapa unit kemajuan.
3. onProgressUpdate( Progress. . . ) berjalan di thread UI setelah publishProgress(
Progress. . . ) dipanggil. Gunakan onProgressUpdate( ) untuk melaporkan suatu
bentuk kemajuan ke thread UI sewaktu komputasi latar belakang dieksekusi.
Misalnya, Anda bisa menggunakannya untuk meneruskan data guna
menganimasikan bilah kemajuan atau menampilkan log di bidang teks.
4. onPostExecute( Result) berjalan di thread UI setelah komputasi latar belakang
selesai.
Untuk detail selengkapnya mengenai metode ini, lihat referensi AsyncTask . Di bawah ini adalah diagram urutan pemanggilan.
Penggunaan AsyncTask
Untuk menggunakan kelas AsyncTask , definisikan subkelas AsyncTask yang
menggantikan metode doInBackground( Params. . . ) (dan biasanya juga metode
onPostExecute( Result) ). Bagian ini menjelaskan parameter dan penggunaan AsyncTask , kemudian menampilkan contoh lengkap.
AsyncTaskLoader
AsyncTaskLoader adalah loader yang setara dengan AsyncTask. AsyncTaskLoader menyediakan metode,
loadInBackground( ), yang dijalankan di thread terpisah. HasilloadInBackground( ) secara otomatis dikirimkan ke thread UI, melalui onLoadFinished( ) LoaderManager callback.
Penggunaan AsyncTaskLoader
Untuk mendefinisikan subkelas AsyncTaskLoader , buat kelas yang memperluas AsyncTaskLoader<D> , dalam hal ini Dadalah tipe data yang sedang Anda muat. Misalnya,
AsyncTaskLoader ini akan memuat daftar string: public static class StringListLoader extends
AsyncTaskLoader <List<String>> {}
Berikutnya, implementasikan konstruktor yang cocok dengan implementasi super kelas:
Konstruktor menggunakan konteks aplikasi sebagai argumen dan meneruskannya ke panggilan untuk super() . Jika loader Anda memerlukan informasi tambahan untuk
melakukan pemuatan, konstruktor bisa mengambil argumen tambahan. Dalam contoh yang ditampilkan di bawah ini, konstruktor menggunakan sebuah istilah kueri.
public StringListLoader(Context context,
String queryString) {
super(context);
mQueryString = queryString;
}
Untuk melakukan pemuatan, gunakan metode penggantian loadInBackground( ) , akibat metode doInBackground( ) dari AsyncTask . Misalnya:
@Override
public List<String> loadInBackground() {
List<String> data = new ArrayList<String>;
//TODO: Load the data from the network or from a database
return data;
}
Pelaksanaan Praktikum
1. Pertama jalankan aplikasi IDE Android Studio, caranya :
a. Pilih Start → Android Studio
b. Pilih → Start a new Android Studio Project
c. Pilih → Empty Activity → Next
Configure Your Project
Name → AsyncTaskDownload
Package Name → ubah menjadi nama blog kalian masing-masing
Save Location → D:\2021\semester 6\TI-2\PBO
Language → Java
Minimum API Level → API 14 → Klik Finish
2. Maka akan Tampil IDE Android Studio, setelah itu Buka dan ubah script
activity_main.xml menjadi seperti di bawah ini
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Download" />
<TextView
android:id="@+id/attrs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="15dp"
android:layout_marginRight="15dp"
android:text="unggasid.com"
android:textStyle="bold" />
</RelativeLayout>
maka akan terlihat seperti ini:
3. Setelah itu Buka dan ubah script MainActivity.java menjadi seperti di bawah ini :
package 07nenengevi.blogspot.com.asynctaskdownload;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import java.sql.Struct;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.util.Log;
public class MainActivity extends AppCompatActivity implements OnClickListener {
public static final int download_progress = 0;
private String file_url = "http://dewiratnawati246.blogspot.com/wp-content/uploads/2021/Ringkasan-Tesis-Dewi-Ratnawati.pdf";
Button btn_download;
ProgressDialog prgDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_download = (Button) findViewById(R.id.button1);
btn_download.setOnClickListener(this);
}
@Override
public void onClick (View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
Log.i("Permission", "Permission is Denied");
ActivityCompat.requestPermissions(MainActivity.this,new String[] {
Manifest.permission.WRITE_EXTERNAL_STORAGE},101);
}else{
new DownloadFileAsync().execute(file_url);
}
}
@Override
protected Dialog onCreateDialog(int id){
switch (id) {
case download_progress:
prgDialog = new ProgressDialog(this);
prgDialog.setMessage("Download file...");
prgDialog.setIndeterminate(false);
prgDialog.setMax(100);
prgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
prgDialog.setCancelable(false);
prgDialog.show();
return prgDialog;
default:
return null;
}
}
class DownloadFileAsync extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() {
showDialog(download_progress);
}
@Override
protected String doInBackground(String... aurl) {
Log.i("testing", "url download : " + aurl[0]);
URL url = null;
int count;
try {
url = new URL(aurl[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
Log.i("koneksi", "koneksi berhasil");
int lenghtOfFile = conexion.getContentLength();
Log.i("UkuranFile", "ukuran : " + String.valueOf(lenghtOfFile));
InputStream input = new BufferedInputStream(url.openStream(), 10 * 1024);
String fileName = conexion.getHeaderField("Content-Disposition");
if (fileName == null || fileName.length() < 1) {
URL downloadeUrl = conexion.getURL();
fileName = downloadeUrl.getFile();
fileName = fileName.substring(fileName.lastIndexOf("/") * 1);
} else {
fileName = URLDecoder.decode(fileName.substring(fileName.indexOf("filename=") + 9),
"UTF-8");
fileName = fileName.replaceAll("\"", "");
}
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/Download/" + fileName);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress((int) ((total * 100) / lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
e.printStackTrace();
Log.d("koneksi", "koneksi gagal");
}
return null;
}
protected void onProgressUpdate(Integer... progress) {
prgDialog.setProgress(progress[0]);
}
protected void onPostExecute(String result) {
dismissDialog(download_progress);
Toast.makeText(getApplicationContext(),"Download complete. File in /sdcard/Donwload", Toast.LENGTH_SHORT).show();
}
}
}
4. Buat sebuah file xml baru dengan Nama network_security_config.xml di dalam
folder /res/xml
dan ketikan kode program berikut seperti di bawah ini :
<?xml version="1.0" encoding="utf-8"?> <network-security-config xmlns:android="http://schemas.android.com/apk/res/android"> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
File ini digunakan agar aplikasi bisa mengakses url yang tanpa SSL (url https), dan struktur nya sendiri akan menjadi seperti gambar di bawah in
5. Sesuaikan script AndroidManifest.xml seperti di bawah ini untuk mendaftarkan
komponen Intent Filter dan mendaftarkan permission akses internet & write external storage yang kita butuhkan
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="dewiratnawati246.blogspot.com.asynctaskdownload">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
6. Lalu coba jalankan menggunakan emulator yang tersedia di Android Studio Anda, maka akan tampil seperti gabar dibawah ini
Aplikasi akan meminta akses ke media penyimpanan anda, pilih izinkan selanjutnya tekan tombol download Kembali maka progress download akan terlihat di layer.
Tidak ada komentar:
Posting Komentar