[Android căn bản] Bài 9: Asynctask trong Android

[Android căn bản] Bài 9: Asynctask trong Android

Chào các bạn chúng ta lại gặp nhau trong series Android truyền kì rồi hom trước tôi đã giới thiệu với các bạn về RecyclerView hôm nay tôi xin giới thiệu với các bạn một thành phần quan trọng trong Android đó là Asynctask vậy Asynctask là gì?

Giới thiệu Asytask.

Nếu bạn nào đã xài Android từ rất lâu rồi cái thời Android mới được bang chủ Google giới thiệu với các đồng đạo và nhân sĩ võ lâm giang hồ bí kíp Android thần chưởng thì bạn hẳn còn nhớ khi bạn dùng một số ứng dụng như nghe nhạc hay xem phim trực tuyến khi bạn nhấn vào một nút chức năng nào đó trên ứng dụng thì ứng dụng thi thoảng sẽ bị treo hay hoạt động không ổn định và điều này đã được tâu bẩm lện bang chủ Google và bang chủ đã tìm ra nguyên nhân của nó đó chính là do các tác vụ của ứng dụng đó cùng hoạt động trên một theard và các tác vụ nào dài hơi sẽ có thể gây ra hiện tượng ứng dụng sẽ bị treo hay thậm chí là chết vì lúc đó ứng dụng có nhiều tác vụ chạy cùng một theard quá sẽ tốn rất nhiều tài nguyên hệ thống, vậy giải pháp nào cho vấn đề trên sau khi nghiên cứu và bàn luận cùng các đồng lão trong bang phái Google bang chủ đã ra mắt một chiêu thức mới đó là Asynctask vậy chiêu thức đó nguyên lí hoạt động như thế nào.

Nguyên lí hoạt động của Asynctask.

Trước đây các phiên bản của bí kíp Android ngày trước thì chưa được thiết kế để chạy đa luồng tức là trong một lần thì triển võ công không thể xuất ra nhiều chiêu thức cùng lúc được mà trong một lần thi triển võ công nếu có nhiều chiêu thức thì các chiêu thức này sẽ được xuất ra tuần tự và theo thứ tự của các chiêu thức và việc này sẽ làm chậm thời gian xuất chiêu và tiêu tốn nhiều công lực mà không mang lại nhiều hiệu quả vì thế mà các phiên bản sau của bí kíp các đồng lão của bang phái đã nâng cấp cho bí kíp có khả năng chạy đa luồng có thể xuất nhiều chiêu thức cùng lúc thông qua chiêu thức Asynctask.

Hiện nay Android được chia ra làm hai luồng riêng biệt là UI(Main) theard và background theard luồng UI theard là luồng mà xử lí các tác vụ về giao diện người dùng còn background theard chính là tầng xử lý các tác vụ nền, đây cũng chính là nơi xỷ lí các chiêu thức nặng và phức tạp cần thời gian lâu hơn để xử lí và nhờ có Asynctask mà khi thực hiện các tác vụ nặng ứng dụng sẽ không còn tình trạng treo ứng dụng hay giao diện hoạt động không ổn định hay không mượt mà nữa. vậy làm cách nào để sử dụng AsyncTask.

Sử dụng Asytask.

Trước khi vào vị dụ tôi muốn nói với các bạn một số điều:

Bạn nhìn vào hình sau

Asynctask

Asynctask

Như bạn thấy trên hình khi tạo class kế thừ Asynctask class thì ta thấy Asynctask class sẽ có 3 đối số generic được truyền vô theo thứ tự là AsyncTask<Params, Progress, Result>.

Params: Là giá trị ((biến) được truyền vào khi gọi thực thi tiến trình và nó sẽ  được truyền vào doInBackground

Progress: Là  giá trị (biến) dùng để update giao diện diện lúc tiến trình thực thi, biến này sẽ được truyền vào hàm onProgressUpdate.

Result: Là biến dùng để lưu trữ kết quả trả về sau khi tiến trình thực hiện xong.

Và thông thường một AsyncTask sẽ có 4 hàm:

onPreExecute() : Tự động được gọi đầu tiên khi tiến trình được kích hoạt.

doInBackground(): Được thực thi trong quá trình tiến trình chạy nền, thông qua hàm này để ta gọi hàm onProgressUpdate để cập nhật giao diện (gọi lệnh publishProgress(). Ta không thể cập nhật giao diện trong hàm doInBackground().

onProgressUpdate (): Dùng để cập nhật giao diện lúc runtime

onPostExecute(): Sau khi tiến trình kết thúc thì hàm này sẽ tự động sảy ra. Ta có thể lấy được kết quả trả về sau khi thực hiện tiến trình kết thúc ở đây.

Trong 4 hàm trên thì hàm doInBackground() bắt buộc phải tồn tại, còn các hàm khác có thể không có cũng được.

Khi muốn thực thi tiến trình thì tại activity ta goi hàm execute() là có thể thực thi tiến trình rồi.

Sau đây là 1 ví dụ đơn giản.

Ví dụ:

Ở ví dụ này tôi sử dụng Progressbar cho nó dễ thấy 😀

File activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.tuandc.akinosora.asyntask.MainActivity">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:max="10"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:layout_editor_absoluteY="134dp" />
</android.support.constraint.ConstraintLayout>
File MainActivity.java
package com.tuandc.akinosora.asyntask;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private ProgressBar tientrinh;

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

        new BackgroundAsyntask(this).execute();// Thực thi tiến trình
    }
    class BackgroundAsyntask extends AsyncTask<Void, Integer , Void>{
        public BackgroundAsyntask(Activity m_Activity) {
            this.m_Activity = m_Activity;
        }

        Activity m_Activity;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Hàm này sẽ được khởi chạy đầu tiên khi tiến trình đc gọi
            Toast.makeText(MainActivity.this, "Bắt đầu", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected Void doInBackground(Void... voids) {
            // Hàm này chính là hàm sẽ được gọi khi thực hiện tiến trình nền và tại đây bạn sẽ viết các công việc mình cần thực hiện tại đây
            //tuyệt đối không được cập nhật giao diện trong hàm này
            for (int i = 0; i< 11 ; i++){
               SystemClock.sleep(100);//nghỉ 100 milisecond thì tiến hành update UI
               publishProgress(i);//khi gọi hàm này thì onProgressUpdate sẽ thực thi
           }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            // Hàm này được sử dủng để cập nhật các giá trị trả về từ doInbackground lên giao diện của ứng dựng
           tientrinh = m_Activity.findViewById(R.id.progressBar);
            tientrinh.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            // Hàm này sẽ được gọi khi kết thức tiến trình.

            Toast.makeText(MainActivity.this, "Kết thúc", Toast.LENGTH_SHORT).show();
        }
    }
}

Như vậy tôi đã giới thiệu với các bạn về Asyntask và các thực thi đa tiến trinh bằng Asynctask trong Android. Cảm ơn các bạn đã theo dõi và hẹn gặp lại các bạn ở những bài tiếp theo của series Android truyền kì.

Các bài liên quan

Tuấn ĐC

Tuấn ĐC

Tôi thích tự do, làm những gì mình thích, thích đi nhiều nơi và học được nhiều thứ.

Liên hết bài viết: ""