Bài 30: Các thư viện thường dùng trong Android - Lập trình Android cơ bản

Đăng bởi: Admin | Lượt xem: 4128 | Chuyên mục: Android


1. Giới thiệu

Để giảm thời gian phát triển một ứng dụng Android, mình thường sử dụng các thư viện Android mã nguồn mở có sẵn cho các phần Networking, UI, Dependency Injection (DI), Reactive Library… Có rất nhiều thư viện để lựa chọn nhưng tiêu chí của mình là đơn giản, dễ xài, performance tốt và đủ đáp ứng nhu cầu phát sinh trong việc phát triển ứng dụng Android.
Dưới đây là một số thư viện thường dùng trong các ứng dụng Android :

2. RxAndroid

Dạo gần đây khái niệm Reactive Programming khá phổ biển ở các blog, twitter hay Android Weekly, và RxAndroid là một trong những thư viện Reactive khá nổi tiếng trên Android.
Mình dần thay thế callback bằng RxAndroid. RxAndroid có phần map để transform data khá hay để custom lại những response từ backend trả về. Bên cạnh đó, observerOn hay subscribeOn giúp mình quy định việc mình thực thi trên thread nào hay khi trả về thì đẩy lên thread nào. RxAndroid còn rất nhiều chức năng thú vị khác mà mình cũng đang tìm hiểu.
Hơn nữa, RxAndroid với Retrofit khá tiện khi dùng chung.
Sử dụng RxAndroid cũng khá đơn giản:
retrofitService.getImage(url)
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(bitmap -> myImageView.setImageBitmap(bitmap));

3. Retrofit

Retrofit là một type-safe HTTP client cho Android và Java. Retrofit giúp dễ dàng kết nối tới một dịch vụ REST ở trên web bằng cách dịch API thành các Interface của Java
Thư viện mạnh mẽ này giúp bạn lấy dữ liệu trả về dạng JSON hoặc XML, sau đó phần tích cú pháp thành Plain Old Java Objects (POJOs). Các request GET, POST, PUT, PATCH, DELETE đều có thể được thực thi
Retrofit được xây dựng trên nền một số thư viện mạnh mẽ và công cụ khác, đằng sau nó có sử dụng OkHttp. Ngoài ra Retrofit không tích hợp sẵn bộ chuyển đổi JSON -> Java, thay vào đó ta có thể sử dụng các thư viện sau:
Gson: com.squareup.retrofit:converter-gson
Jackson: com.squareup.retrofit:converter-jackson
Moshi: com.squareup.retrofit:converter-moshi
Vs Protocol buffers, Retrofit hỗ trợ
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Và đối với XML, Retrofit hỗ trợ:
Simple Framework: com.squareup.retrofit2:converter-simpleframework

3.1 Tại sao lại dùng Retrofit ?

  1. Retrofit đơn giản trong việc setup và sử dụng : phát triển thư viện type-safe HTTP của riêng của bạn để giao tiếp với một REST API có thể thật sự rất khó: bạn phải xử lý nhiều khía cạnh, chẳng hạn như kết nối, bộ nhớ đệm, thử lại yêu cầu sai, luồng, phân tích phản hồi, xử lý lỗi và nhiều thứ khác. Mặt khác, Retrofit là một thư viện được tổ chức tốt, tài liệu hướng đầy đủ và đã thử nghiệm sẽ giúp bạn tiết kiệm rất nhiều thời gian quý báu và những đau đầu không cần thiết.
  2. Retrofit là một type-safe HTTP client: trình biên dịch sẽ xác nhận hợp lệ các kiểu dữ liệu trong khi biên dịch và ném một lỗi nếu bạn cố gán kiểu sai cho một biến.
  3. Retrofit nhanh hơn rất nhiều so với việc sử dụng Volley, AysncTask
Cú pháp thông dụng khi sử dụng thư viện Retrofit:
Định nghĩa API:
public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@path("user") String user);
}
Config cho Endpoint:
RestAdapter restAdapter = new RestAdapter.Builder()
  .setEndpoind("https://api.github.com/")
  .build();

GitHubService service = restAdapter.create(GitHubService.class);
Gọi API:
List<Repo> repos = service.listRepos("octocat");

4. Butterknife

Butterknife là thư viện Android hỗ trợ Bind view và tự động cast đúng kiểu cho từng loại view. Giảm thiểu việc viết findViewId quá nhiều trong code.
Butterknife generate code nên sẽ không lo chuyện performance ở runtime.
Thường mình viết một BaseActivity cho nó extends từ AppCompatActivity rồi implement lại hàm setContentView rồi bỏ ButterKnife.bind(this) vào hàm này.
class ExampleActivity extends Activity {
  @Bind(R.id.title) TextView title;
  @Bind(R.id.subtitle) TextView subtitle;
  @Bind(R.id.footer) TextView footer;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_activity);
    ButterKnife.bind(this);
    // TODO Use fields...
  }
}

5. OkHttp 

Một trong những việc rất nhàn chán khi phát triển ứng dụng trên nền tảng Android đó là xử lý kết nối mạng, bắt lỗi và exception, kiểm soát kích thước file download và thời gian download file đó...vv.
Tuy nhiên có một thư viện giúp chúng ta giải quyết các vấn đề đó một cách nhanh gọn, đó là OkHttp.
OkHttp sẽ giúp ta
-Kiểm soát kết nối tới server
-Kiểm soát các kết nối không tốt và thử kết nối lại khi có thể
-Nó sẽ thử thay thế server IP address nếu kết nối tới một IP nào đó bị thất bại vào IP thay thế được chuẩn bị sẵn
-Giảm độ trễ của request, giảm size của file cần download
-Tránh lặp lại các request đã được hoàn thành
Interceptor có nghĩa là “làm can thiệp một cái gì đó trong việc đến được đích đến của nó”, tương tự như nghĩa của nó Interceptor can thiệp vào một request, thay đổi request đó và sau đó gửi lại đến điêm đến của nó (server).
Các Interceptor là để quan sát, điều chỉnh và có khả năng chặn các request và những phản hồi. Thông thường các Interceptor thực hiện thêm, xóa , chuyển đổi các Headers trên request hoặc trên các phản hồi được trả về (từ server).
okHttp là một thư viện làm việc rất hiệu quả với giao thức HTTP và có thể hoạt động được khi mạng gặp vấn đề trục trặc. Trong quá trình truyền tải dữ liệu này, nếu kết nối mạng không ổn định, okHttp sẽ phục hồi ngầm dữ liệu từ các kết nối lỗi. Nếu có nhiều địa chỉ IP, thư viện này sẽ lần lượt sử dụng các địa chỉ IP này nếu kết nối ban đầu của bạn bị lỗi hoặc ngắt kết nối.
okHttp hỗ trợ Android 2.3 hoặc các phiên bản cao hơn.
Thư viện okHttp cho phép:
⦁ Hỗ trợ chuẩn HTTP/2
⦁ Connection pooling
⦁ Giảm kích thước file download
⦁ Response caching

6. Google GSON

  GSON là một java library hỗ trợ việc convert Java Objects sang định dạng JSONtương ứng, và ngược lại, nó cũng có thể sử dụng để convert từ JSON sang Java Objects. Có một vài thư viên Java cũng có khả năng làm việc này, những Google Gson hỗ trợ tối ưu hơn cả và đặc biệt nó được update liên tục.Nó có thể làm việc với các Java Object tùy ý ngay cả với việc các object trong hệ thống cũ không có source code.  
Mục đích của Google Gson
  1. Cung cấp kỹ thuật xử lý đơn giản để convert từ Java Object sang JSON và ngược lại.
  2. Cho phép các unmodifiable objects converted từ Java sang JSON và ngược lại.
  3. Hỗ trợ mở rộng Java Generics.
  4. Cho phép custom format của object.
  5. Hỗ trợ custom các objects phức tạp.
  6. Và rất nhiều nữa
Ngoài ra, GSON cũng là nhân của Retrofit đã nói ở trên.
Github : https://github.com/google/gson

7. Picasso

Khi phát triển ứng dụng có nhiều ảnh hoặc phải load và hiển thị ảnh từ server thì có rất nhiều bạn băn khoăn là làm sao cho app không bị đơ UI, khi chờ phải load ảnh Trước đây thì mình thường viết AsyncTask cho chạy trong MainThead, những load ảnh sẽ chạy bất đồng bộ để app hiển thị hết xong thì ảnh load về dần dần. Chứ nếu để load ảnh tuần tự thì chắc để chờ đợi xong load ảnh mà chưa kịp load xong đã chuyển màn hình thì chắc là đơ luôn app Nhưng từ khi chuyển sang dùng Picasso thì không cần phải lo vấn đề này nữa bởi Picasso đã làm hết những phần này rùi. Chính vì thế trong bài viết này mình giới thiệu thư viện chuyên về download ảnh từ server cho app android rất tuyệt vời Các bạn muốn tìm hiểu rõ hơn về Picasso thì vào
Ưu điểm picasso
Picasso có những ưu điểm sau: 1. Đơn giản hóa code, chính là ưu điểm hàng dầu của Picasso, thay vì viết nhiều dòng bạn chỉ cần viết có 1 dòng là có thể load được ảnh 2. Tối ưu hóa bộ nhớ sử dụng của ứng dụng 3. Tự động sử dụng RAM cache và Disk cache để tối ưu hóa lưu lượng mạng và tăng tốc độ hiển thị ảnh 4. Tự động transforms bitmap và cancel download ngữ cảnh. Bạn sẽ không cần phải chú ý đến transforms bitmap và download bị cancel hay không. Công việc này thư viện làm hết => Đó chính là ưu điểm chính của Piccaso, mình chỉ khoái là nó chỉ cần có vài dòng làm được hết không phải sử dụng nhiều code
Bạn chỉ cần copy đoạn mã sau vào trong file build.gradle
dependencies {
    compile 'com.squareup.picasso:picasso:2.5.2'
}
Load ảnh vào View
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
Thật đơn giản, chỉ với 1 dòng code là ta đã có thể hiển thị ảnh lên view, nếu không sử dụng thư viện thì cần phải code nhiều. Sử dụng thư viện giúp tránh được bug phát sinh.

8. Tổng kết

Bài viết tổng hợp các thư viện thường dùng trong lập trình Android, mỗi thư viện là một cách giúp cho việc code của các bạn trở nên nhẹ nhàng hơn . Hi vọng bài viết giúp ích được ít nhiều trong quá trình làm việc của các bạn.
Bài tiếp theo: Tìm hiểu về MVC, MVP và MVVM >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!