.Thao tác với luồng

Một phần của tài liệu tìm hiểu hệ điều hành android và xây dựng ứng dụng minh họa (Trang 39 - 41)

Trong Android có luồng chính cập nhật giao diện là UI Thread và các luồng phụ Background Để tạo một luồng Background ta làm như sau:

Khai báo lớp luồng với Runable:

private Runnable MyTask = new Runnable() {

public void run() {

// làm gì đó

} }; Tạo đối tượng luồng:

Thread my_thread = new Thread(MyTask);

Để khởi động luồng dùng lệnh: my_thread.start();

Để trao đổi dữ liệu giữa UI Thread và luồng Background ta có các cách sau: ++Dùng phương thức runOnUiThread()

40 Ví dụ:

runOnUiThread(new Runnable() {

public void run() {

// thao tác có thể sử dụng dữ liệu của UI Thread

} }); ++Sử dụng Handler:

Đối tượng Handler sẽ bắt các thông điệp từ luồng Background cho vào hàng đợi thơng điệp, và có thể thao tác với dữ liệu UI Thread bất cứ lúc nào.

Ví dụ:

Handler handler = new Handler() { @Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

//làm gì đó với msg, có thể lấy dữ liệu bằng msg.getData() }

};

Trong luồng Background ta có thể làm như sau: Message msg = handler.obtainMessage();

// msg có thể chứa nhiều loại dữ liệu ví dụ: msg.setData(Data Object) handler.sendMessage(msg);

++Sử dụng AsyncTask:

AsyncTask có các phương thức làm việc với luồng Background và UI Thread

Phương thức doInBackground(): thực hiện các công việc trong luồng Background, để truyền dữ liệu nó dùng hàm publishProgress(dữ liệu).

41

Trong đó kiểu dữ liệu trùng với kiểu của dữ liệu trong publishProgress(), phương thức có thể dùng values để cập nhật UI Thread.

Ngồi ra cịn có hai phương thức là: onPreExecute() thực hiện với dữ liệu trên UI Thread, được gọi trước khi thực hiện doInBackground() và phương thức onPostExecute() thực hiện với dữ liệu trên UI Thread sau khi thực hiện doInBackground().

Ví dụ:

Tạo lớp MyAsyncTask kế thừa từ AsyncTask < ? ,? , ? > ? tương ứng các kiểu dữ liệu trong các phương thức

class MyAsyncTask extends AsyncTask<Void, Integer, Void> { int progress = 0;

@Override

protected Void doInBackground(Void... params) {

// làm gì đó publishProgress(Kiểu Integer); } return null; } @Override

protected void onPostExecute(Void result) {

// làm gì đó

super.onPostExecute(result);

}

@Override

protected void onProgressUpdate(Integer... values) {

// làm gì đó với values

super.onProgressUpdate(values);

} }

Để thực hiện ta gọi: new MyAsyncTask().execute();

Một phần của tài liệu tìm hiểu hệ điều hành android và xây dựng ứng dụng minh họa (Trang 39 - 41)

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

(56 trang)