Hướng dẫn code light sensor trên android studio

Hầu hết chúng ta đều trưởng thành nhờ tìm hiểu các thông tin mới, những thứ như Internet là một phần quan trọng trong cuộc sống. Mọi thứ đang trở nên gắn kết hơn bao giờ hết, vì vậy xây dựng những ứng dụng Android có nội dung tĩnh có thể là một ý tưởng tồi. Thay vào đó, bạn nên xem xét việc xây dựng các ứng dụng có thể hiển thị nội dung mới mỗi khi người dùng mở chúng.

Điều đó nghe có vẻ khó khăn, nhưng với ngày càng nhiều những trang web phơi bày tài nguyên của họ thông qua REST API, điều đó trở nên khá dễ dàng. (Hãy xem Hướng dẫn cho người mới bắt đầu với HTTP và REST để có một sự hiểu biết cơ bản).

Trong hướng dẫn này, tôi sẽ cho bạn thấy cách làm thế nào để sử dụng các lớp và phương thức có sẵn trong Android SDK để kết nối với máy chủ web từ xa và tương tác với chúng bằng cách sử dụng REST API của chúng.

1. Bật truy cập Internet

Tận dụng một REST API rõ ràng là liên quan đến việc sử dụng Internet. Tuy nhiên, ứng dụng Android chỉ có thể truy cập Internet khi chúng có quyền

<uses-permission android:name="android.permission.INTERNET" />

90. Vì vậy, trước khi bạn bắt đầu viết bất kỳ code truy cập mạng, bạn phải chắc chắn rằng thẻ

<uses-permission android:name="android.permission.INTERNET" />

91 sau đây có ở trong tập tin manifest của dự án:

1

<uses-permission android:name="android.permission.INTERNET" />

Bởi vì

<uses-permission android:name="android.permission.INTERNET" />

90 không được xem là một quyền nguy hiểm, nên bạn không cần phải yêu cầu cho nó trong runtime trên các thiết bị chạy API Level 23 hoặc cao hơn.

2. Tạo các tiến trình nền

Nền tảng Android không cho phép bạn chạy các các tác vụ kết nối mạng trên tiến trình chính của ứng dụng. Vì vậy, tất cả các code kết nối mạng của bạn phải thuộc về một tiến trình nền. Cách dễ nhất để tạo ra một tiến trình là sử dụng phương thức

<uses-permission android:name="android.permission.INTERNET" />

93 của lớp

<uses-permission android:name="android.permission.INTERNET" />

94. Đối số duy nhất của

<uses-permission android:name="android.permission.INTERNET" />

93 là một đối tượng

<uses-permission android:name="android.permission.INTERNET" />

96.

1

AsyncTask.execute(new Runnable() { 2

@Override  
3
public void run() {  
4
    // All your networking logic  
<uses-permission android:name="android.permission.INTERNET" />

0

<uses-permission android:name="android.permission.INTERNET" />

1

<uses-permission android:name="android.permission.INTERNET" />

2

<uses-permission android:name="android.permission.INTERNET" />

3

<uses-permission android:name="android.permission.INTERNET" />

4

<uses-permission android:name="android.permission.INTERNET" />

5

Nếu bạn muốn tìm hiểu thêm về chạy các tác vụ trong nền, tôi đề nghị bạn đọc hướng dẫn về các tác vụ nền này từ loạt bài Android từ đầu.

3. Tạo một kết nối HTTP

Bằng cách sử dụng phương thức

<uses-permission android:name="android.permission.INTERNET" />

97 của lớp

<uses-permission android:name="android.permission.INTERNET" />

98, bạn có thể nhanh chóng thiết lập một kết nối đến bất kỳ endpoint của REST. Giá trị trả về của

<uses-permission android:name="android.permission.INTERNET" />

97 phải được chuyển cho một đối tượng của

1

00 hoặc

1

01, tùy thuộc vào endpoint được truy cập thông qua HTTP hay HTTPS.

1

00 và

1

01 đều cho phép bạn thực hiện các thao tác như thêm thông tin header và đọc các phản hồi.

Đoạn code sau đây cho bạn thấy cách thiết lập kết nối với root endpoint của GitHub API:

1

<uses-permission android:name="android.permission.INTERNET" />

7

2

<uses-permission android:name="android.permission.INTERNET" />

9

3

1

1

4

1

3

<uses-permission android:name="android.permission.INTERNET" />

0

1

5

<uses-permission android:name="android.permission.INTERNET" />

2

1

7

Lưu ý rằng lớp

1

01 là một lớp con của lớp

1

4. Thêm Header cho yêu cầu

Hầu hết các trang web cung cấp REST API muốn có khả năng xác định ứng dụng của bạn là duy nhất. Cách dễ nhất để giúp họ làm như vậy là thêm header

1

06 duy nhất trong tất cả các yêu cầu của bạn.

Để thêm một header

1

06 vào yêu cầu của bạn, bạn phải sử dụng phương thức

1

08 của đối tượng

1

00. Ví dụ, ở đây là cách bạn thiết lập header

1

06 vào my-rest-app-v0.1:

1

1

9

Bạn có thể thêm nhiều header vào yêu cầu của bạn bằng cách gọi phương thức

1

08 nhiều lần. Ví dụ, đoạn code sau đây thêm một header

1

12 và một header

1

13 tuỳ biến:

1

AsyncTask.execute(new Runnable() { 1

2

AsyncTask.execute(new Runnable() { 3

3

AsyncTask.execute(new Runnable() { 5

4

AsyncTask.execute(new Runnable() { 7

5. Đọc các phẩn hồi

Một khi bạn đã truyền vào tất cả các header cho yêu cầu, bạn có thể kiểm tra xem bạn có một phản hồi hợp lệ hay không bằng cách sử dụng phương thức

1

14 của đối tượng

1

1

AsyncTask.execute(new Runnable() { 9

2

2

1

3

2

3

4

2

5

<uses-permission android:name="android.permission.INTERNET" />

0

2

7

<uses-permission android:name="android.permission.INTERNET" />

2

2

9

Nếu lớp

1

00 lấy được một mã số phản hồi, chẳng hạn như 301, nó xử lý mã số một cách tự động và chuyển hướng sau đó. Vì vậy, thông thường, bạn sẽ không cần phải viết thêm bất kỳ code nào để kiểm tra chuyển hướng.

Trong trường hợp không có lỗi, bạn có thể gọi phương thức

1

17 để có được một tham chiếu đến Input Stream của kết nối.

1

@Override  
1

Hầu hết các RESST API ngày nay trả về dữ liệu dưới định dạng JSON hợp lệ. Vì vậy, thay vì đọc trực tiếp từ đối tượng

1

18, tôi khuyên bạn tạo ra một

1

19 cho nó.

1

@Override  
3

2

@Override  
5

6. Phân tích JSON trả về

Android SDK có một lớp gọi là JsonReader, nó giúp bạn dễ dàng có thể phân tích tài liệu JSON. Bạn có thể tạo ra một đối tượng mới của lớp

1

20 bằng truyền đối tượng

1

19 vào hàm xây dựng của nó.

1

@Override  
7

Cách mà bạn trích xuất một phần cụ thể của thông tin từ tài liệu JSON phụ thuộc vào cấu trúc của nó. Ví dụ, tài liệu JSON trả về bởi root endpoint từ REST API của GitHub trông như thế này:

1

@Override  
9

2

3

1

3

3

3

4

3

5

<uses-permission android:name="android.permission.INTERNET" />

0

3

7

<uses-permission android:name="android.permission.INTERNET" />

2

3

9

<uses-permission android:name="android.permission.INTERNET" />

4

public void run() {  
1
public void run() {  
2
public void run() {  
3
public void run() {  
4
public void run() {  
5
public void run() {  
6
public void run() {  
7
public void run() {  
8
public void run() {  
9

4

0

4

1

4

2

4

3

4

4

4

5

4

6

4

7

4

8

4

9

    // All your networking logic  
0
    // All your networking logic  
1
    // All your networking logic  
2
    // All your networking logic  
3
    // All your networking logic  
4
    // All your networking logic  
5
    // All your networking logic  
6
    // All your networking logic  
7
    // All your networking logic  
8
    // All your networking logic  
9

<uses-permission android:name="android.permission.INTERNET" />

00

<uses-permission android:name="android.permission.INTERNET" />

01

<uses-permission android:name="android.permission.INTERNET" />

02

<uses-permission android:name="android.permission.INTERNET" />

03

<uses-permission android:name="android.permission.INTERNET" />

04

<uses-permission android:name="android.permission.INTERNET" />

05

<uses-permission android:name="android.permission.INTERNET" />

06

<uses-permission android:name="android.permission.INTERNET" />

07

<uses-permission android:name="android.permission.INTERNET" />

08

<uses-permission android:name="android.permission.INTERNET" />

09

<uses-permission android:name="android.permission.INTERNET" />

10

<uses-permission android:name="android.permission.INTERNET" />

11

<uses-permission android:name="android.permission.INTERNET" />

12

<uses-permission android:name="android.permission.INTERNET" />

13

<uses-permission android:name="android.permission.INTERNET" />

14

<uses-permission android:name="android.permission.INTERNET" />

15

<uses-permission android:name="android.permission.INTERNET" />

16

<uses-permission android:name="android.permission.INTERNET" />

17

<uses-permission android:name="android.permission.INTERNET" />

18

<uses-permission android:name="android.permission.INTERNET" />

19

<uses-permission android:name="android.permission.INTERNET" />

20

2

9

Như bạn có thể thấy, các phản hồi chỉ là một đối tượng JSON lớn có chứa một số khoá. Để trích xuất giá trị của khóa được gọi là organization_url từ nó, bạn sẽ phải viết code sau đây:

1

<uses-permission android:name="android.permission.INTERNET" />

23

2

<uses-permission android:name="android.permission.INTERNET" />

25

3

<uses-permission android:name="android.permission.INTERNET" />

27

4

<uses-permission android:name="android.permission.INTERNET" />

29

<uses-permission android:name="android.permission.INTERNET" />

0

<uses-permission android:name="android.permission.INTERNET" />

31

<uses-permission android:name="android.permission.INTERNET" />

2

<uses-permission android:name="android.permission.INTERNET" />

33

<uses-permission android:name="android.permission.INTERNET" />

4

<uses-permission android:name="android.permission.INTERNET" />

35

public void run() {  
2

<uses-permission android:name="android.permission.INTERNET" />

37

public void run() {  
4

<uses-permission android:name="android.permission.INTERNET" />

39

public void run() {  
6

<uses-permission android:name="android.permission.INTERNET" />

41

public void run() {  
8

<uses-permission android:name="android.permission.INTERNET" />

43

4

0

<uses-permission android:name="android.permission.INTERNET" />

45

4

2

<uses-permission android:name="android.permission.INTERNET" />

47

4

4

<uses-permission android:name="android.permission.INTERNET" />

3

4

6

2

9

Code ở trên xử lý phản hồi JSON như là một stream của các token. Vì vậy, nó chiếm rất ít bộ nhớ. Tuy nhiên, bởi vì nó phải xử lý mỗi lần một token duy nhất, nên nó có thể bị chậm khi xử lý các phản hồi lớn.

Sau khi bạn đã trích xuất tất cả các thông tin cần thiết, bạn phải luôn luôn gọi phương thức

1

22 của đối tượng

1

20 để nó giải phóng mọi tài nguyên mà nó nắm giữ.

Bạn cũng phải đóng kết nối bằng cách gọi phương thức

1

24 của đối tượng

1

00.

1

<uses-permission android:name="android.permission.INTERNET" />

53

7. Sử dụng các phương thức HTTP khác nhau

Giao diện REST dựa trên HTTP sử dụng các phương thức HTTP để xác định kiểu hoạt động cần được thực hiện trên một nguồn tài nguyên. Trong các bước trước đó, chúng ta sử dụng phương thức

1

26 của HTTP để thực hiện một thao tác đọc. Bởi vì lớp

1

00 sử dụng phương thức

1

26 theo mặc định, nên chúng ta không cần phải chỉ định một cách rõ ràng.

Để thay đổi phương thức HTTP của đối tượng

1

00, bạn phải sử dụng phương thức

1

30 của nó. Ví dụ như đoạn code sau đây sẽ mở một kết nối đến một endpoint thuộc về httpbin.org và thiết lập phương thức HTTP thành

1

31:

1

<uses-permission android:name="android.permission.INTERNET" />

55

2

<uses-permission android:name="android.permission.INTERNET" />

57

3

<uses-permission android:name="android.permission.INTERNET" />

59

4

1

1

<uses-permission android:name="android.permission.INTERNET" />

0

<uses-permission android:name="android.permission.INTERNET" />

63

Như bạn đã biết, yêu cầu

1

31 được sử dụng để gửi dữ liệu đến máy chủ. Bằng cách ghi vào Output Stream của kết nối, bạn có thể dễ dàng thêm bất kỳ dữ liệu nào vào body của yêu cầu

1

31. Tuy nhiên, trước khi bạn làm vậy, bạn phải chắc chắn rằng bạn gọi phương thức

1

34 của đối tượng

1

00 và truyền

1

36 vào nó.

Đoạn code sau đây cho bạn thấy cách để gửi một cặp khóa-giá trị đơn giản lên máy chủ:

1

<uses-permission android:name="android.permission.INTERNET" />

65

2

<uses-permission android:name="android.permission.INTERNET" />

67

3

1

1

4

<uses-permission android:name="android.permission.INTERNET" />

71

<uses-permission android:name="android.permission.INTERNET" />

0

<uses-permission android:name="android.permission.INTERNET" />

73

<uses-permission android:name="android.permission.INTERNET" />

2

1

1

<uses-permission android:name="android.permission.INTERNET" />

4

<uses-permission android:name="android.permission.INTERNET" />

77

public void run() {  
2

<uses-permission android:name="android.permission.INTERNET" />

79

8. Lưu các phản hồi vào bộ nhớ đệm

Luôn là một ý tưởng tốt khi lưu vào bộ nhớ bộ nhớ đệm các phản hồi HTTP. Bằng cách đó, bạn có thể không những giảm mức tiêu thụ băng thông của ứng dụng, mà còn làm cho nó đáp ứng tốt hơn. Từ API Level 13 trở đi, Android SDK cung cấp một lớp gọi là

1

37, cho phép bạn dễ dàng lưu bộ nhớ đệm mà không cần thực hiện bất kỳ thay đổi nào đối với logic của mạng.

Để cài đặt một bộ nhớ đệm cho ứng dụng của bạn, bạn phải gọi phương thức

1

38 của lớp

1

37. Phương thức cần một đường dẫn tuyệt đối xác định nơi mà bộ nhớ đệm phải được cài đặt, và một con số chỉ định kích thước bộ nhớ đệm. Bạn có thể sử dụng phương thức

1

40 nếu bạn không muốn chỉ định đường dẫn tuyệt đối theo cách thủ công.

Đoạn code sau sẽ cài đặt một bộ nhớ đệm có kích thước là 100.000 byte:

1

<uses-permission android:name="android.permission.INTERNET" />

81

2

<uses-permission android:name="android.permission.INTERNET" />

83

Khi bộ nhớ đệm đã được cài đặt, thì lớp

1

00 sẽ bắt đầu sử dụng nó một cách tự động. Để kiểm tra xem bộ nhớ đệm của bạn có hoạt động hay không, bạn có thể sử dụng phương thức

1

42, phương thức này trả về số lượng các phản hồi HTTP mà được phục vụ từ bộ nhớ đệm.

1

<uses-permission android:name="android.permission.INTERNET" />

85

2

<uses-permission android:name="android.permission.INTERNET" />

87

3

2

9

Tổng kết

Có hàng ngàn REST API để bạn có thể tự do sử dụng trong các ứng dụng Android. Bằng cách sử dụng chúng, bạn có thể làm cho ứng dụng của bạn thêm nhiều thông tin phong phú, thú vị và giàu tính năng. Trong hướng dẫn này, bạn đã học được cách sử dụng lớp

1

00 để tiêu thụ những REST API như thế. Bạn cũng học được cách để tạo ra một bộ nhớ đệm cho các phản hồi HTTP để giữ cho ứng dụng của bạn sử dụng băng thông thấp.

Nếu bạn nghĩ rằng sử dụng

1

00 là khó, thì bạn nên thử một thư viện bên thứ ba, chẳng hạn như Volley. Thư viện như thế này sử dụng lớp

1

00 bên trong, nhưng cung cấp rất nhiều phương thức thuận tiện cho phép bạn làm cho code của bạn dễ đọc và súc tích hơn.

Để tìm hiểu thêm về kết nối mạng trên nền tảng Android, bạn có thể tham khảo tài liệu hướng dẫn Network Operations của Android.