คุณเคยประสบปัญหา Asynctask ช้าหรือไม่ บางครั้งก็ทำงานเร็ว บางครั้งก็ทำงานช้า(มาก) แต่ไม่รู้จะแก้ยังไง ทำตามเว็บก็แล้ว แต่ก็ยังไม่ได้ วันนี้เรามีวิธีแก้ครับ (ขายของสุดๆอ่ะ) สำหรับคนที่ยังไม่รู้จักว่า Asynctask คืออะไรลองอ่านบทความด้านล่างนี้นะครับ น่าจะพอช่วยให้เข้าใจได้บ้าง
สารพันเรื่องราวของ “Thread” บนแอนดรอยด์ การปะทะกันของ Thread, AsyncTask, AsyncTaskLoader และ IntentService ของ Nuuneoi
การใช้ AsyncTask ในการกำหนดค่าเริ่มต้นให้กับ Layout ของ Sleeping Forless
พอดีก่อนหน้านี้แอพที่ผมทำอยู่ดันไปเจอปัญหานี้เหมือนกันจึงลองหาวิธีแก้ดู ทั้ง Debug ทั้ง LogCat จนสืบไปเจอจุดที่มันทำงานช้า นั่นก็คือช่วงระหว่าง onPreExecute และ doInBackground ซึ่งเป็นช่วงก่อนที่จะเริ่มทำงานใน Background Thread แต่ช่วงเวลาที่ต้องรอจะไม่แน่นอน บางครั้งก็ไม่กี่วินาที แต่บางครั้งก็ต้องรอนานถึง 10 กว่าวินาทีเลยทีเดียว
[java] private class MyAsyncTask extends AsyncTask<Void, Integer, Void> {protected void onPreExecute() {
}
protected Void doInBackground(Void… params) {
}
protected void onProgressUpdate(Integer… values) {
}
protected void onPostExecute(Void result) {
}
}
[/java]
ผมไปเจอว่า AsyncTask ทำงานทีละตัว มันต้องรอให้ตัวอื่นทำงานเสร็จก่อนมันถึงจะเริ่มทำงานได้ นั่นคือเหตุผลว่าทำไม บางครั้งมันถึงทำงานช้า บางครั้งมันถึงทำงานเร็ว เพราะการรอทำงานของ Task อื่นๆนั่นเอง แน่นอนว่ามีปัญหาก็ต้องมีทางแก้
นั่นคือ หลัง Version Honeycomb หรือ API 13 เป็นต้นมา เราสามารถทำให้ AsyncTask ทำงานแบบ Parallel โดยการใช้สั่ง
[java]task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);[/java]
แทน
[java]task.execute();[/java]
แต่เดี๋ยวนี้เราเริ่ม Project มาก็ Min SDK เป็น 15 กันหมดแล้ว คงจะใช้ executeOnExecutor กันได้ตามสะดวก ไม่เด้ง แต่ถ้าใครเป็นโปรเจคที่รองรับ SDK เก่าๆได้ ควรจะป้องกันแอพ Crash กันด้วยนะครับ
[java]
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void StartAsyncTaskInParallel(MyAsyncTask task) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
else
task.execute();
}
[/java]
หวังว่าจะช่วยให้แอพของคุณทำงานได้อย่างมีประสิทธิภาพขึ้นนะครับ
Reference
http://android-er.blogspot.com/2014/04/run-multi-asynctask-as-same-time.html
http://stackoverflow.com/questions/12159403/executing-multiple-asynctasks-parallely