Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีรัน AsyncTask ทุกช่วงเวลาที่กำหนดใน Android

ตัวอย่างนี้สาธิตวิธีการทำให้ AsyncTask ทำงานซ้ำๆ ทุก 5 วินาที โดยใช้ Handler และ postDelayed

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

Android Studio → File → New Project

ขั้นตอนที่ 2: Layout (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="AsyncTask"
        android:textSize="24sp"
        android:textStyle="bold" />

</RelativeLayout>

ขั้นตอนที่ 3: MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    private void RunTask() {
        MyToast myToast = new MyToast();
        myToast.execute();
    }

    private class MyToast extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... strings) {
            // ทำงานใน Background Thread
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    // รันซ้ำทุก 5 วินาที (5000 ms)
                    handler.postDelayed(this, 5000);
                    Toast.makeText(getApplicationContext(), 
                        "AsyncTask runs every 5 seconds", 
                        Toast.LENGTH_SHORT).show();
                }
            }, 3000); // เริ่มต้นหลัง 3 วินาที
        }
    }
}

ขั้นตอนที่ 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        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>

ข้อควรระวังและแนะนำ

⚠️ AsyncTask ถูก Deprecated แล้ว (API Level 30+)

Google แนะนำให้ใช้ Kotlin Coroutines, WorkManager, หรือ RxJava แทน

ทางเลือกที่ดีกว่า (Modern Approach):

1. ใช้ Handler + Runnable (Simple)

private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // ทำงานที่นี่
        Toast.makeText(MainActivity.this, "Running...", Toast.LENGTH_SHORT).show();
        handler.postDelayed(this, 5000); // รันซ้ำทุก 5 วินาที
    }
};

// เริ่มต้น
handler.postDelayed(runnable, 3000);

// หยุด (ใน onDestroy)
handler.removeCallbacks(runnable);

2. ใช้ WorkManager (สำหรับงานที่ต้องทำงานแม้แอปปิด)

PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(
    MyWorker.class, 5, TimeUnit.SECONDS).build();
WorkManager.getInstance(context).enqueue(workRequest);

3. ใช้ Kotlin Coroutines (แนะนำสำหรับโปรเจกต์ใหม่)

lifecycleScope.launch {
    while (true) {
        delay(5000)
        // ทำงานที่นี่
    }
}

การทดสอบ

รันแอป → จะเห็น Toast แสดงข้อความ "AsyncTask runs every 5 seconds" ทุก 5 วินาที