34

1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối
Page 2: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

1. Thread và Handler

2. AsynTask

3. XML

4. JSON

Page 3: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Khái niệm

Các phương thức quan trọng trong Thread

HandleMessage

Xây dựng tương tác cho Thread và Handler

Page 4: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Thread:

Thread (tiểu trình) là đơn vị nhỏ nhất của tiến trình

được định thời bởi hệ điều hành và được bao hàm

trong các tiến trình thực thi của máy tính. Mỗi một

thread phương thức, đối số và biến cục bộ riêng của

thread đó.

Mỗi một máy ảo Android khi chạy đều có ít nhất một

thread chính khi khởi động và có thể còn vài thread

khác dùng để quản lý các tiến trình đang chạy.

Page 5: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Thread:

Mỗi ứng dụng khi được khởi chạy sẽ được hoạt động trên tiến

trình chính (Main Thread).

Có hai loại:

▪ Main Thread (UI Thread): là thread chính của ứng dụng dùng kiểm soát và

thực hiện các công việc liên quan nhiều đến giao diện.

▪ Worker Thread: là các thread phụ dùng xử lý các tác vụ như : kết nối internet,

chuyển đổi XML, download…v..v. Ứng dụng có thể tự khởi động thêm các

thread phụ vào các mục đích cụ thể.

Worker thread không thể can thiệp vào thread chính.

Các thread trong cùng một máy ảo tác động qua lại và được

đông bộ hóa bằng cách sử dụng các đối tượng chia sẻ và các

monitor liên quan đến các đối tượng đó.

Page 6: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Khởi tạo Thread:

▪ Thread t = new Thread(new Runnable() {

@Override

public void run() {

// Do Something

}

});

Page 7: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Một số phương thức quan trọng:

▪ start()

▪ Khởi động thread

▪ run()

▪ Sau khi một thread được khởi động bởi phương thức start() thì

dùng run() để thực thì các dòng lệnh thread này.

▪ wait()

▪ Làm cho thread hiện tại phải chờ đợi cho đến khi một thread khác

gọi phương thức notify()

▪ sleep(long millisec)

▪ Bắt buộc Thread sẽ phải ngưng hoạt động trong khoảng thời gian

được thiết lập

▪ No`tify()

▪ Dùng để gọi lại một đối tượng thread đang chờ đợi

Page 8: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Handler:

Handler là đối tượng có thể đi xuyên tiến trình để cho

phép gửi, xử lí các thông điệp và các đối tương

Runable. Mỗi Handler có thể liên kết với một thread

và hàng đợi thông điệp của thread đó.

Bạn có thể tạo ra một thread của riêng bạn và giao

tiếp ngược với main thread của ứng dụng thông qua

một Handler.

Phương thức quan trọng:

▪ sendMessage(): gửi tin nhắn lên Handler ngay lập tức.

Page 9: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Khởi tạo Handler:

Tạo một đối tượng Handler và ghi đè lại phương thức

handleMessage đế bắt và xử lý các thông điệp liên lạc.

Handler handler = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

//Kiểm tra message

if(msg != null){

//Xử lý message nhận được từ Thread

}

return true;

}

});

Page 10: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Thread sẽ gửi tin nhắn lên Handler và Handler đóng vai trò kiểm

tra tin nhắn là gì và làm những việc tương ứng.

Thread t = new Thread(new Runnable() {

@Override

public void run() {

Message mss = new Message();

mss.arg1 = 1;

handler.sendMessage(mss);

}

});

t.start();

Page 11: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Khái niệm

Thuộc tính

Khởi tạo AsyncTask

Page 12: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

AsyncTask:

Lớp trừu tượng cho phép thực hiện khai báo các tiến

trình xử lý ngầm và cập nhật giao diện một cách tự động.

Bao gồm cơ chế tự động tính toán một cách bất đồng bộ

để đưa ra thời gian thực thi cho mỗi tiến trình xử lý.

Thời gian xử lý được tính toán thông qua ba tham số:

▪ Params: các thông số đầu vào

▪ Progress: dữ liệu trong quá trình xử lý

▪ Result: kết quả cuối cùng của tiến trình xử lý

Page 13: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

AsyncTask:

Các phương thức cho phép nắm giữ dữ liệu ở nhiều giai đoạn

khác nhau của tiến trình xử lý bao gồm 4 bước:

▪ onPreExcute

▪ Tiến trình tiền xử lý

▪ doInBackground

▪ Tiến trình đang ở chế độ ngầm

▪ onProgessUpdate

▪ Tiến trình cập nhật dữ liệu

▪ onPostExcute

▪ Tiến trình cập nhật dữ liệu trên UI

Page 14: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

AsyncTask:

Các qui tắc quan trọng khi xử lý trên AsyncTask:

▪ AsyncTask phải được tạo, gọi và thực thi trên tiến trình UI

▪ Tự động hoá từ phiên bản JellyBean

▪ Không được gọi tường minh các phương thức xử lý

onPostExcute, doInBackground…

▪ Mỗi AsyncTask chỉ được gọi một lần duy nhất.

▪ Có thể thực hiện huỷ AsyncTask thông qua phương thức

onCancel(boolean)

▪ Khi đó phương thức onCancel(Object) sẽ được gọi sau

phương thức doInBackground thay vì onPostExcute.

Page 15: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

AsyncTask:

Có thể tạo AsyncTask thông qua kế thừa lớp AsyncTask.

Ví dụ tạo lớp AsyncTask và thực thi xử lý trong doInBackground

private class DownloadFilesTask extends AsyncTask<URL, Integer,

Long> {

protected Long doInBackground(URL... urls) {

int count = urls.length;

long totalSize = 0;

for (int i = 0; i < count; i++) {

totalSize += Downloader.downloadFile(urls[i]);

publishProgress((int) ((i / (float) count) * 100));

if (isCancelled()) break;

}

return totalSize;

}

}

Page 16: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

AsyncTask:

Ví dụ cập nhật dữ liệu

private class DownloadFilesTask extends AsyncTask<URL,

Integer, Long> {

….

protected void onProgressUpdate(Integer... progress) {

setProgressPercent(progress[0]);

}

protected void onPostExecute(Long result) {

showDialog("Downloaded " + result + " bytes");

}

}

Page 17: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

XML Pull Parser.

DOM Parser

Page 18: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

XML (eXtensible Markup Language, "Ngôn ngữ Đánh

dấu Mở rộng") là ngôn ngữ đánh dấu với mục đích

chung do W3C đề nghị, để tạo ra các ngôn ngữ đánh

dấu khác. Mục đích chính của XML là đơn giản hóa việc

chia sẻ dữ liệu giữa các hệ thống khác nhau, đặc biệt là

các hệ thống được kết nối với Internet..

Các ngôn ngữ dựa trên XML (Ví dụ: RDF, RSS,

MathML, XHTML, SVG, GML và cXML)

Page 19: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Ví dụ:

Page 20: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

XML Pull Parser: cho phép trình bày các thành phần

trong tập tin theo dạng chuỗi các thẻ (tag) và các đánh

dấu (event), để làm việc với XML Pull Parser cần khảo

sát các thuộc tính và các đối tượng sau:XmlPullParserFactory: khởi tạo đối tượng XmlPullParser từ tập tin tài liệu

XML.

XmlPullParer: đối tượng kiểm soát việc duyệt và truy xuất dữ liệu.

START_DOCUMENT: điểm đánh dấu bắt đầu của tập tin XML.

END_DOCUMENT: điểm đánh dấu kết thúc của tập tin XML.

START_TAG: điểm đánh dấu bắt đầu cặp thẻ XML.

END_TAG: điểm đánh dấu kết thúc cặp thẻ XML.

Page 21: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Ví dụ: Ví dụ xử lý XML với DOM: truy xuất dữ liệu các

thẻ con trong thẻ <weather> đoạn XML trên.

Page 22: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

DOM Parser: giao diện lập trình ứng dụng (API) có dạng

một cây cấu trúc dữ liệu, các đối tượng cần khởi tạo khi

sử dụng:

▪ Element: đại diện cho một thẻ trong XML.

▪ NodeList: đại diện cho một thẻ có chứa nhiều thẻ con.

▪ Document: tập tin tài liệu được khởi tạo từ dữ liệu XML

thông qua DocumentBuilder.

▪ DocumentBuilder: đối tượng hỗ trợ chuyển đổi dữ liệu

XML thành cấu trúc tập tin XML cho việc đọc ghi dữ liệu.

▪ DocumentBuilderFactory: khởi tạo đối tượng

DocumentBuilder.

Page 23: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Ví dụ xử lý XML với DOM: truy xuất dữ liệu thẻ

<weather> trong đoạn XML trên:

Page 24: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

24

Page 25: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

JSON (JavaScript Object Notation) được định nghĩa dữ

theo ngôn ngữ JavaScript, tiêu chuẩn ECMA-262 năm

1999, cấu trúc là một định dạng văn bản đơn giản với

các trường dữ liệu được lồng vào nhau. JSON được sử

dụng để trao đổi dữ liệu giữa các thành phần của một

hệ thống tương thích với hầu hết các ngôn ngữ C, C++,

C#, Java, JavaScript, Perl, Python...

Page 26: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Tuỳ thuộc vào dữ liệu cần trao đổi, JSON có thể có nhiều dạng

khác nhau, tuy nhiên có thể tống hợp ở những hai dạng chính sau:

Một đối tượng Object chứa các cặp giá trị string/value không cần

thứ tự, được bao trong cặp “{}”, các giá trị bên trong được định

dạng “string:value” và chia cách nhau bởi dấu “,”. Value ở đây có

thể là chuỗi, số, true- false, null...Có thể xem mô tả cùng ví dụ sau:

Page 27: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Một đối tượng mảng có bao gồm nhều phần tử con có

thứ tự. Các phần từ con được bao trong cặp “[]” và chia

cách nhau bởi dấu “,”. Mỗi phần tử con có thể là một giá

trị đơn lẻ như: số, chuỗi, true-false, null hoặc một object

khác, thậm chí có thể là một mảng.

Page 28: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Việc thực hiện đọc ghi dữ liệu JSON trong Android có

thể thông qua nhiều thư viện khác nhau như GSON,

Json.Smart, Jackson… tuy nhiên trong tài liệu chúng ta

sẽ khảo sát các lớp JSON trong gói org.json được tích

hợp sẵn trong Android SDK. Trong gói này bao gồm bốn

lớp chính:JSONObject: đối tượng quản lý JSON ở dạng một Object.

JSONArray: đối tượng quản lý JSON ở dạng tập hợn các Object hoặc

Array.

JSONStringer: đối tượng chuyển dữ liệu JSON thành dạng chuỗi.

JSONTokener: chuyển đổi đối tượng JSON (chuẩn RFC-4627) mã hoá

chuỗi một thành đối tượng tương ứng.

Page 29: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc

của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

tượng, dữ liệu sẽ được ghi vào một JSONObject; nếu

dữ liệu là một mảng, dữ liệu sẽ được ghi vào một

JSONArray.

Ví dụ 1: ghi dữ liệu có cấu trúc đơn giản dạng

JSONObject:

Page 30: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần

lưu trữ. Nếu dữ liệu cần ghi là một đối tượng, dữ liệu sẽ được ghi vào một

JSONObject; nếu dữ liệu là một mảng, dữ liệu sẽ được ghi vào một

JSONArray.

Ví dụ 1: ghi dữ liệu có cấu trúc đơn giản dạng JSONObject:

Page 31: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối
Page 32: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần

lưu trữ. Nếu dữ liệu cần ghi là một đối tượng, dữ liệu sẽ được ghi vào một

JSONObject; nếu dữ liệu là một mảng, dữ liệu sẽ được ghi vào một

JSONArray.

Ví dụ 1: ghi dữ liệu có cấu trúc đơn giản dạng JSONObject:

Page 33: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

Slide bài giảng Lập trình Android, T3H

http://www.utilities-online.info/xmltojson

http://www.freeformatter.com/xml-to-json-

converter.html

33

Page 34: 1. Thread và Handler · Để thực hiện ghi dữ liệu JSON, cần xác định rõ cấu trúc của dữ liệu cần lưu trữ. Nếu dữ liệu cần ghi là một đối

34