Android - สรุป AsyncTask บนแอนดรอยด์


คลาสที่สืบทอด AsyncTask 
ต้อง implement callback method เพื่อให้โค้ดทำงานได้ ได้แก่ : doInBackground


หรืออาจจะมากกว่านั้นโดยใช้
  1. (onPreExecute)  เตรียมพร้อมตัวแปลจาก UI  ----- UI thread
  2. (doInBackground)  สั่งทำงานใน background Thread   ----- Background thread
  3. (onProgressUpdate) ระหว่างนั้นอาจจะอัพเดทความคืบหน้าให้ผู้ใช้รู้  ---- UI thread
  4.  (onPostExecute) publish results บน UI Thread หลังการทำงานจบ  ---- UI thread
โดยไม่ต้องมีการจัดการ threads and/or handlers ให้ยุ่งยากในการเขียนโค้ดแบบเก่าๆ.





3 AsyncTask's generic types

ในตอนแรกที่เราสร้าง class ที่สืบทอด AsyncTask ขึ้นมาจะเจอกับ 3 generic types ที่ต้องระบุ

private class MyTask extends AsyncTask<Void, Void, Void> { 
    ... 
}

หมายถึง AsyncTask<Params, Progress, Result>

1.Params หมายถึง ประเภทของข้อมูลที่ส่งเข้ามาใน Task
new MyAsyncTask().execute(param1, param2, param3);

2.Progress หมายถึง ประเภทของความคืบหน้าที่จะถูกส่งมาจาก doinbackground;
(ส่วนมากเป็น int ถ้าเราไม่ต้องการ ก็ใส่เป็น void)

3.Result หมายถึง ประเภทของข้อมูลที่ return มาจาก doInbackground();





Threading rules
  • AsyncTask class จะต้องถูกประกาศบน UI Thread
  • execute(Params...) จะต้องเรียกใช้บน UI Thread.
  • สามารถสั่ง Executed ได้ครั้งเดียวเท่านั้น
  • AsyncTasks ควรจะนำมาใช้ใน short operations (a few seconds at the most.)
  • Do not call onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) manually.
  • For long periods of time แนะนำ [APIs] in java.util.concurrent เช่น : Executor , ThreadPoolExecutor , FutureTask
  • หรือใช้ Services 
Memory observability
all callback จะเรียกถูกเรียกใช้ในเวลาเดียวกัน (synchronized) 
และใน document ได้แนะนำการจัดการดังนี้
  • Set member fields จาก constructor หรือ onPreExecute() , และส่งต่อไปใน doInBackground(Params...)
  • Set member fields in doInBackground(Params...) และส่งต่อไป  onProgressUpdate(Progress...) and onPostExecute(Result).



สามารถสั่ง Cancel Task ได้ทุกเวลา
โดยการเรียกใช้ cancel(boolean)
หลังจากนั้น onCancelled(Object)  จะทำงานแทน onPostExecute()
และเราอาจจะใช้ isCancelled() เพื่อเช็คความถูกต้อง



ปัญหาที่อาจพบ
- เมื่อผู้ใช้ change screen orientation อาจจะ destroy thread ที่ทำงานอยู่
- ดังนั้นเราต้อง cancel task เมื่อ activity destroyed




Example Code



ไม่มีความคิดเห็น:

แสดงความคิดเห็น