Kamis, 10 Juni 2021

BAB 9 PENGENALAN ASYNCTASK DAN ASYNCTASKLOADER

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

BAB 13 CRUD Database MySQL dengan PHP Pada Apk Android Studio

CRUD adalah singkatan dari create, read, update, and delete. Akronim CRUD mengidentifikasi semua fungsi utama yang melekat pada database re...