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();