กันยายน 21, 2017, 10:07:24 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: Background Worker (Thread) and Toast Message (UI)  (อ่าน 7201 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8264


ShadowWares


| |
« เมื่อ: ธันวาคม 14, 2012, 08:34:21 pm »

Background Worker (Thread) and Toast Message (UI)

สร้างกระแสกันต่อ สำหรับคนรัก Android
ย้ำอีกครั้งนะครับว่า สำหรับ Android ในตอนนี้และตอนที่ผ่านมาหลายๆ ตอน ผมเน้นไปที่ Techniques เท่านั้น เนื้อหาต่างๆ เหมาะสำหรับผู้ที่มีประสบการณ์การพัฒนา Application บน Android มาแล้ว นั่นคือรู้จักการใช้เครื่องมือและ Keywords ต่างๆ บนโลกของการพัฒนา Android มาแล้ว ในระดับตีความได้

สำหรับคนที่มองหาพื้นฐาน Android ไม่ต้องหาครับ มันไม่มีอยู่จริง เพราะจริงๆ แล้ว พื้นฐาน Android คือ Java ในระดับยากเลยทีเดียว (ความคิดส่วนตัว)
หากเราไปหาพื้นฐาน Android โปรแกรมแรกที่จะเจอคือ อะไรทำนองนี้:

Code: (java)
public class MainActivity extends Activity {
   @overide
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

   }

Java (ภาษา) + Android SDK (เครื่องมือ/ไลบารี่/ตัวช่วย) แบบเต็มๆ เพราะฉนั้นหากไม่มีพื้นฐาน Java ควรศึกษา Java ก่อนเป็นอันดับแรก

ในตอนนี้จะลงลึกไปอีกนิด นั่นคือการ Update UI จาก Thread อื่นๆ (ไม่ใช้ Main Thread) หรือเรียกว่า "Background Thread" หรือ "Worker Thread" เพื่อให้โปรแกรมกระชับมากขึ้น จะใช้ Toast Message ซึ่งเป็นส่วนหนึ่งของ UI ที่ไม่อนุญาตให้เข้าถึงจาก Background Thread เหมือน UI Components หรือ Widgets อื่นๆ เช่นกัน

เพื่อให้ง่ายต่อกาเรียกใช้งาน จะขอสร้างเป็นฟังก์ชั่น โดยที่ในฟังก์ชั่นนี้มี Thread รันอยู่ และ Thread นี้จะ sleep นาน 5 วินาที ในที่นี้คือจะมี Toast Message แสดงขึ้นมาทุกๆ 5 วินาทีนั่นเอง รายละเอียดของฟังก์ชั่นเป็นดังนี้:

Code: (java)
public void workerFunction(final Context ct) {
   Thread t1 = new Thread(new Runnable() {
      public void run() {
         while (true) {
            Log.i("Santi", "Thread is Running...");
            runOnUiThread(new Runnable() {
               public void run() {
                  Toast.makeText(ct, "Thread Running...", Toast.LENGTH_SHORT).show();
               }
            });
            try {
               Thread.sleep(5000);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
         }
      }
   });
   t1.start();
}


ตอนเรียกใช้งานก็:
Code: (java)
workerFunction(getBaseContext());


นอกจากนี้ยังสามารถใช้ AsyncTask, Handle, .post และอื่นๆ เข้ามาช่วยในเรื่องการ Update UI จาก Background Thread ได้ตามความเหมาะสม หากมีโอกาศจะขอกล่าวถึงในตอนต่อไป

อย่าลืมนะครับว่า Background Thread ของเรามันรันอย่างต่อเนื่อง (while(true)) อยู่เบื้องหลัง Main Thread หรือ Application เพราะฉนั้นต่อให้ปิด Application ไปแล้ว ก็ไม่ได้หมายความว่า Background Thread นี้จะหยุดทำงานไปด้วย มันยังคงทำงานต่อไป และยังคงเห็น Toast Message ปรากฎขึ้นมาทุกๆ 5 วินาทีต่อไป

การสั่งหยุดการทำงานของ Background Thread ดังกล่าวทำได้โดยการเรียก Task Manager ขึ้นมา !!! ไม่ต้องตกใจที่ไม่เห็น Application ของเรารันอยู่ เพราะ Background Thread จะซ่อนตัวเองจาก Task Manager !!! การสั่งหยุดมัน ทำได้โโยการสั่ง Clear Memory

แต่วิธีการที่ดีกว่า คือเขียนโปรแกรมให้สั่ง Stop Thread ดังกล่าว โดยการดักจับ Event onClose/onDestroy แล้วจัดการกับด้วยวิธีการของ Multi-threading จะเหมาะสมที่สุด




บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
narapimniyom
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #1 เมื่อ: กรกฎาคม 02, 2014, 07:01:57 pm »

ขอมูลเยอะดีนะครับ ขอให้ตั้งใจทำต่อไปนะครับ ผมจะได้รู้ไปด้วยครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: