Chương 4: Xử lý bất đồng bộ

Một phần của tài liệu lập trình 3d ứng dụng trên nền tảng android (Trang 57 - 63)

4.1 Thread:

Thơng thường lập trình viên dùng Thread để xử lý các code xử lý nặng, hoặc mất thời gian có thể gây chậm chương trình hoặc giao diện bị block. Thread khá thông dụng và trong Android dùng lớp Thread của Java.

Theo mặc định, mỗi ứng dụng chạy trong một tiến trình và code được thực thi trong thread chính của tiến trình đó. Nếu code xử lý q lâu, không kịp phản hồi lại các sự kiện người dùng trong 5 giây thì sẽ xuất hiện dialog “Application is not responding” và người dùng có thể đóng ứng dụng ngay lập tức. Nếu khơng bị đóng thì ứng dụng sẽ bị lag, điều này là khó chấp nhận.

Thread thread = new Thread() { @Override

public synchronized void start() {

// Khởi tạo các đối tượng cần thiết tại đây

super.start();

}

@Override

public void run() {

super.run();

} };

thread.start(); //bắt đầu thread

• Lưu ý:

– Thread lần đầu thực thi gọi phương thức start(), những lần sau chỉ gọi phương thức run(), không gọi start() nữa.

– Các code xử lý liên quan đến giao diện chỉ được xử lý trong thread chính của ứng dụng (ví dụ load ảnh từ mạng về thì dùng thread, nhưng hiển thị ảnh lên ImageView thì xử lý trong thread chính)

– Sau khi thực thi xong phương thức run(), thread khơng cịn hoạt động nữa.

4.2 Handler:

Trong Android, để tiện việc giao tiếp giữa 2 thread ta dùng đối tượng Handler. Có thể dùng Handler như bộ đếm giây khi chơi nhạc, hoặc chức năng tương tự . Ngồi ra, có thể dùng Handler để đặt xử lý một yêu cầu nào đó sau một khoảng thời gian xác định.

 Giao tiếp giữa 2 Thread:

– Giả sử trong phương thức run() đã lấy xong đối tượng Bitmap về. Muốn truyền đối tượng Bitmap cho Thread chính hiển thị lên màn hình:

Message msg = mHandler.obtainMessage(1, bitmap); mHandler.sendMessage(msg);

– Trong code của Activity (mặc định là thread chính), ta khai báo một đối tượng Handler tương tứng như sau:

Handler mHandler = new Handler() { @Override

if (msg.what == 1) { //Hiển thị Bitmap mImageView.setImageBitmap((Bitmap)msg.obj); } super.handleMessage(msg); } };

– Trong đoạn code trên, đối tượng mHandler lấy ra một message và gắn mã vào cho message đó, kèm theo đối tượng bitmap. Sau đó gửi đi.

– Message gửi đi sẽ được nhận phương thức callback là handleMessage() của đối tượng Handler.

– Handler cịn có thể gửi message để xử lý sau một khoảng thời gian định sẵn sendMessageAtTime hoặc xử lý tại một thời điểm định sẵn sendMessageDelayed.

 Lưu ý:

– Handler được tạo trong thread nào thì sẽ sử dụng hàng đợi message của thread đó.

– Nếu trong hàng đợi message vẫn cịn message thì vẫn cịn thực thi dù đã thốt khỏi ứng dụng.

4.3 AlarmManager (báo hiệu):

Dùng AlarmManager để thực hiện đăng ký xử lý một thao tác nào đó tại một thời điểm nhất định trong tương lai (thường là thời gian dài, nếu xử lý trong thời gian

ngắn thì khuyến cáo nên dùng Handler). Khi đến thời điểm được đặt trước, dù ứng dụng đang khơng chạy thì nó vẫn được gọi. Nếu tắt máy rồi bật lại thì khơng cịn.

 Khởi tạo một AlarmManager:

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); Intent broadcastIntent = new Intent("org.multiuni.android.ACTION..."); PendingIntent pendingIntent = PendingIntent.getBroadcast(this,

0, broadcastIntent, PendingIntent.FLAG_CANCEL_CURRENT); am.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);

 Giải thích:

– Khởi tạo một đối tương AlarmManager để làm việc với Alarm.

– Tạo một intent tên broadcastIntent, intent này được dùng để gửi broadcast khi đến thời điểm định sẵn.

– PendingIntent được khởi tạo gồm context, broadcastIntent ở trên và một cờ báo rằng nếu đã có một Alarm tương tự thì bỏ nó đi và dùng cái mới này.

– Sau cùng, set alarm với 3 thông số: + Bộ đếm thời gian.

+ Thời gian chính xác để bật alarm lên.

+ PendingIntent gửi đi (dùng để xác định tới thời điểm bật alarm lên thì cần phát intent nào).

4.4 Notification (thơng báo):

Trong những trường hợp chúng ta muốn hiện một thông báo về một sự kiện nào đó (tin nhắn, cuộc gọi, email…) cho người dùng mà không muốn ảnh hưởng đến công việc của họ hoặc khơng chắc là họ có đang cầm điện thoại hay không, hoặc bạn muốn hiển thị thơng tin một việc nào đó đang xảy ra trên điện thoại (đang nghe nhạc, đang

trong cuộc gọi, thiếu thẻ nhớ…) và mong người dùng biết thì chúng ta dùng Notification.

Chúng ta có thể tạo một thơng báo có nhiều hình thức khác nhau như có âm báo, rung, đèn led, icon…

Mỗi phương pháp thơng báo có một tham số id kiểu int và tùy chọn một tham số tag kiểu String, có thể là null, tạo thành một bộ hai (tag, id) hoặc (null, id). Bộ hai này nhận diện thông báo từ ứng dụng, và phải là duy nhất trong ứng dụng. Nếu gọi một trong những phương thức thông báo với bộ (tag, id) hiện đang hoạt động và thiết lập các thơng số mới thì nó sẽ được cập nhật. Ví dụ, nếu lướt qua một biểu tượng mới của thanh trạng thái thì biểu tượng cũ của thanh trạng thái sẽ được thay thế bằng biểu tượng mới.

Chúng ta không khởi tạo lớp này trực tiếp mà lấy nó thơng qua

getSystemService(String). Ví dụ:

String svcName = Context.NOTIFICATION_SERVICE; NotificationManager notificationManager;

notificationManager = (NotificationManager)getSystemService(svcName);

NotificationManager là một dịch vụ hệ thống dùng để quản lý các Notification.

 Tạo một thông báo:

– Tạo một đối tượng Notification, truyền vào icon để hiển thị ở thanh trang thái và thời gian hiển thị:

// chọn một drawable để hiển thị như là một icon của thanh trạng thái int icon = R.drawable.icon;

// Text để hiển thị lên thanh trạng thái khi thông báo được chạy String tickerText = “Notification”;

// thanh trạng thái mở rộng sắp xếp các thông báo theo thứ tự thời gian when = System.currentTimeMillis();

Notification notification = new Notification(icon, tickerText, when);

– Cấu hình giao diện của Notification trong cửa sổ trạng thái mở rộng, sử dụng phương thức setLatestEventInfo. Cửa sổ trạng thái mở rộng này

hiển thị icon và thời gian được khai báo trong constructor và đồng thời hiển thị tiêu đề và chi tiết về chuỗi thông báo.

Context context = getApplicationContext(); // Text để hiển thị trên cửa sổ trạng thái mở rộng String expandedText = “Extended status text”; // Tiêu đề của thanh trạng thái mở rộng

String expandedTitle = “Notification Title”; // Intent chạy một activity khi text được click Intent intent = new Intent(this, MyActivity.class);

PendingIntent launchIntent = PendingIntent.getActivity(context, 0, intent, 0);

notification.setLatestEventInfo(context, expandedTitle, expandedText, launchIntent);

– Cải tiến thông báo bằng các thuộc tính khác của đối tượng Notification để làm nháy đèn trên LED trên thiết bị, rung điện thoại hay trình diễn các file nhạc.

 Gọi một thơng báo:

Để thực hiện gọi một thông báo, gọi phương thức notify của

NotificationManager:

int notificationRef = 1;

notificationManager.notify(notificationRef, notification);

Để cập nhật một thông báo đã được sử dụng, gọi lại và truyền lại giá trị reference ID. Cũng có thể sử dụng ID này để hủy thơng báo bằng cách gọi phương thức cancel của NotificationManager.

notificationManager.cancel(notificationRef);

Một phần của tài liệu lập trình 3d ứng dụng trên nền tảng android (Trang 57 - 63)

Tải bản đầy đủ (DOCX)

(137 trang)
w