Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 40 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
40
Dung lượng
0,95 MB
Nội dung
LẬP TRÌNH DI ĐỘNG Bài 9: Multithreading + Background Works Nội dung Multithreading Threads Multithreading Ưu/nhược điểm multithread Tiếp cận android Handler Messages Runnable object AsyncTask Timer TRƯƠNG XUÂN NAM Phần Multithreading TRƯƠNG XUÂN NAM Threads Process (tiến trình): đơn vị thực thi nhỏ quản lý mức độ hệ điều hành; process cấp nhớ, tài nguyên lượng CPU riêng; process không ảnh hưởng lẫn Thread (mạch/luồng): đoạn mã thực thi CPU cách liên tục; chia sẻ nhớ, tài nguyên CPU với thread khác thuộc process Application (ứng dụng) chạy có thread chính, ứng dụng kết thúc thread kết thúc, ứng dụng tạo thêm thread cần TRƯƠNG XN NAM Threads Mỗi thread có thuộc tính priority mức độ ưu tiên thread đó, độ ưu tiên cao lượng CPU cấp cho nhiều Thread có độ ưu tiên thấp daemon thread (idle thread – Windows), chạy CPU rỗi Các thread process tương tác đồng hóa với qua việc sử dụng đối tượng dùng chung biến monitor Java dùng chế synchronized wait-notify để xử lý tình tranh chấp tài nguyên thread TRƯƠNG XUÂN NAM Threads Process (Dalvik Virtual Machine 1) Process (Dalvik Virtual Machine 2) Common memory resources Common memory resources Main thread Thread-2 Main thread Thread-1 TRƯƠNG XUÂN NAM Multithreading Multi-user (đa người dùng): phục vụ lúc nhiều người dùng Multi-tasking (đa nhiệm): chạy đồng thời nhiều process Multi-threading (đa luồng): thực thi đồng thời nhiều thread process Với CPU đơn, việc xử lý multithreading giả lập Với CPU nhiều nhân luồng, multithreading thực thực song song (parallel), việc thực song song nâng cao sức mạnh thiết bị lên nhiều lần phức tạp hóa việc lập trình TRƯƠNG XUÂN NAM Multithreading java // viết thread theo cách thứ class MyThread extends Thread { public void run() { // phần thực thi thread viết } } // viết thread theo cách thứ hai class MyRunnable implements Runnable { public void run() { // phần thực thi thread viết } } // tạo chạy thread MyThread t1 = new MyThread(); t1.start(); MyRunnable t2 = new MyRunnable(); new Thread(t2).start(); TRƯƠNG XUÂN NAM Ưu/nhược điểm multithread Tận dụng tốt lực thiết bị đa nhân Trong số tình giải tình trạng nghẽn cổ chai, kết hệ thống đa luồng vận hành nhanh đáng kể so với đơn luồng Ví dụ: tiến trình chờ liệu từ I/O lúc CPU rảnh rỗi, hệ thống đa luồng CPU chuyển cho thread khác để làm việc Lập trình viên cần tập trung vào việc viết tốt mã cho nhiệm vụ cụ thể mà không cần quan tâm tới việc thực thi đa luồng nào, cơng việc người viết code trở nên đơn giản TRƯƠNG XUÂN NAM Ưu/nhược điểm multithread Lập trình viên phải làm quen với kiến thức số nguyên tắc viết ứng dụng Android trì main thread chạy UI Không cho phép thực thao tác I/O main thread (kết nối lấy liệu từ mạng, đọc liệu từ stream,…) Các thread không trực tiếp làm việc với UI Chia sẻ đồng liệu tiến trình Ứng dụng đa luồng khó gỡ lỗi hơn, đặc biệt xảy lỗi thread Việc phát giải deadlock phức tạp TRƯƠNG XUÂN NAM 10 Phần AsyncTask TRƯƠNG XUÂN NAM 26 AsyncTask Chúng ta thấy hầu hết công việc chạy tuân theo kịch giống nhau, q trình bước bản: (chuẩn bị) => ((chạy) (cập nhật)) => (kết thúc) Android cung cấp mẫu AsyncTask theo kịch AsyncTask cho phép tiến trình dễ dàng cập nhật UI thread mà không quan tâm tới handler hay chế tương tự Không phải công việc chạy theo kịch (nghĩa cần thread) TRƯƠNG XUÂN NAM 27 AsyncTask TRƯƠNG XUÂN NAM 28 AsyncTask kiểu tổng quát (generic) Params, Progress, Result trạng thái onPreExecute, doInBackground, onProgressUpdate, onPostExecute TRƯƠNG XUÂN NAM phương thức bổ trợ publishProgress 29 Các tham số kiểu AsyncTask AsyncTask Params: kiểu liệu tham số phương thức doInBackground, liệu gửi cho background thread Progress: kiểu liệu gửi cho onProgressUpdate để công bố kết lên UI thread Result: kiểu liệu kết tính tốn doInBackground trả về, liệu tham số phương thức onPostExecute Chú ý: Không phải AsyncTask dùng đến ba kiểu liệu Đối với kiểu không dùng đến, ta dùng kiểu “Void” Cú pháp “String…” tương tự “String[]” TRƯƠNG XUÂN NAM 30 Hoạt động AsyncTask AsyncTask's methods onPreExecute: gọi UI thread để chuẩn bị cho việc chạy background Hàm thường dùng để setup tác vụ, chẳng hạn để progress bar UI doInBackground: gọi background thread sau onPreExecute chạy xong Hàm thực tính tốn background Hàm phải trả kết tính tốn truyền thành tham số onPostExecute Trong thực thi, hàm dùng publishProgress để báo cáo tiến độ hoạt động lên UI, hàm publishProgress tự động gọi onProgressUpdate vào thời điểm phù hợp onProgressUpdate: gọi tự động publishProgress Thời điểm thực thi không xác định Hàm thường dùng để hiển thị thông báo tiến độ lên UI Ví dụ cập nhật progress bar log text field onPostExecute: gọi UI thread sau cơng việc tính tốn background xong Kết tính tốn background truyền cho hàm tham số TRƯƠNG XUÂN NAM 31 Ví dụ: layout TRƯƠNG XUÂN NAM 32 Ví dụ class DownloadWebPageTask extends AsyncTask { protected String doInBackground(String urls) { String response = "", s = ""; for (String url : urls) { DefaultHttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(url); try { InputStream content = client.execute(httpGet).getEntity().getContent(); BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); TRƯƠNG XUÂN NAM 33 Ví dụ while ((s = buffer.readLine()) != null) response += s; } catch (Exception e) {} } return response; } protected void onPostExecute(String result) { textView.setText(result); } } TRƯƠNG XUÂN NAM 34 Ví dụ public class ReadWebpageAsyncTask extends Activity { private TextView textView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textView = (TextView) findViewById(R.id.TextView01); } public void readWebpage(View view) { DownloadWebPageTask task = new DownloadWebPageTask(); task.execute(new String[] { "http://www.mobipro.vn" }); } } TRƯƠNG XUÂN NAM 35 Phần Timer TRƯƠNG XUÂN NAM 36 Timer Timer tính có sẵn Java sáng tạo android Cho phép lập lịch thực thi tác vụ vào thời điểm định sẵn Tác vụ thực lần lặp lại sau khoảng thời gian Timer không hoạt động theo thời gian thực, cần thận trọng sử dụng class tác vụ thời gian thực Bộ đôi Timer TimerTask với TRƯƠNG XUÂN NAM 37 Timer Timer: class giúp ta đặt lịch TimerTask: class giúp ta định nghĩa cơng việc cần thực cơng việc có lịch Viết lại TimerTask cách viết lại hàm “public void run()” (tương tự thread, thân TimerTask implements Runnable) TimerTask có số hàm hữu ích: boolean cancel(): giúp hủy tác vụ long scheduledExecutionTime(): trả thời điểm thực tác vụ lần cuối TRƯƠNG XUÂN NAM 38 Timer Hai phương thức giúp đặt lịch chạy tác vụ: schedule(TimerTask, when): thực TimerTask vào thời điểm when Ví dụ: timer.schedule(tasknew, new Date()); scheduleAtFixedRate(TimerTask, when, period): thực lặp lặp lại TimerTask thời điểm when lặp lại sau period millisecond Một số phương thức thú vị nên tìm hiểu thêm schedule(TimerTask task, long delay, long period) schedule(TimerTask task,long delay) TRƯƠNG XUÂN NAM 39 Timer TextView tv = (TextView) findViewById(R.id.main_timer_text); Timer t = new Timer(); t.scheduleAtFixedRate(new TimerTask() { public void run() { runOnUiThread(new Runnable() { public void run() { tv.setText(String.valueOf(time++)); } }); } }, 0, 1000); TRƯƠNG XUÂN NAM 40 ... Thread-2 Main thread Thread-1 TRƯƠNG XUÂN NAM Multithreading Multi-user (đa người dùng): phục vụ lúc nhiều người dùng Multi-tasking (đa nhiệm): chạy đồng thời nhiều process Multi-threading... dung Multithreading Threads Multithreading Ưu/nhược điểm multithread Tiếp cận android Handler Messages Runnable object AsyncTask Timer TRƯƠNG XUÂN NAM Phần Multithreading TRƯƠNG XUÂN... xử lý công việc liên quan tới giao di? ??n UI thread cần tốc độ nên loại thread-unsafe (nhanh không an toàn làm việc với thread) Hệ thread muốn cập nhật giao di? ??n phải xử lý phức tạp Android