คลาสที่สืบทอด AsyncTask
ต้อง implement callback method เพื่อให้โค้ดทำงานได้ ได้แก่ : doInBackground
ต้อง implement callback method เพื่อให้โค้ดทำงานได้ ได้แก่ : doInBackground
หรืออาจจะมากกว่านั้นโดยใช้
- (onPreExecute) เตรียมพร้อมตัวแปลจาก UI ----- UI thread
- (doInBackground) สั่งทำงานใน background Thread ----- Background thread
- (onProgressUpdate) ระหว่างนั้นอาจจะอัพเดทความคืบหน้าให้ผู้ใช้รู้ ---- UI thread
- (onPostExecute) publish results บน UI Thread หลังการทำงานจบ ---- UI thread
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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น