12/08/2018, 09:29

Thư viện network AsynHttpClient trên Android

Tổng Quan Một thư viện network đã được xây dựng dựa trên thư viện Apache HttpClient . Tất cả những request đã được thực hiện bên ngoài tiến trình giao diện chính của App chúng ta( Main UI Thread ) nhưng bất kỳ một callback logic nào cũng sẽ được thự thi trên cùng Thread như là một ...

Tổng Quan

Một thư viện network đã được xây dựng dựa trên thư viện Apache HttpClient . Tất cả những request đã được thực hiện bên ngoài tiến trình giao diện chính của App chúng ta(Main UI Thread ) nhưng bất kỳ một callback logic nào cũng sẽ được thự thi trên cùng Thread như là một callback đã được sử dụng trong Handler của Android. Ngoài ra bạn cũng có thể sử dụng nó trong Service or trong những tiến trình background , thư viện sẽ tự động nhận diện trong context nó đang chạy.

Tính Năng

  • Làm những Request HTTP không đồng bộ, xử lý những response trong bất kỳ callback tương ứng.
  • Những Request HTTP xảy ra bên ngoài tiến trình giao diện chính (UI Thread).
  • Requests sử dụng threadpool cho việc hạn chế sử dụng tài nguyên đồng thời.
  • Các Params trong những phương thức GET/POST đã được xây dựng sẵn (RequestParams).
  • Multipart file uploads không sử dụng thư viện bên thứ 3 (**third party library **).
  • Streamed JSON uploads không cần bổ sung thư viện.
  • Kích thước thư viện nhỏ, không ảnh hưởng tới app của bạn.
  • Tự động lấy lại request, tối ưu hoá trong việc kết nối trên mobile
  • Tự động giải decoding gzip response hỗ trợ cho các request nhanh.
  • Hỗ trợ giao thức Binary với BinaryHttpResonseHandler.
  • Hỗ trợ cho việc parsing JSON với JsonHttpResoneHandler.
  • Lưu trữ các response trực tiếp vào file với FileAsynchHttpResonseHandler.
  • Lưu trữ cookie vào trong app của bạn với SharedPreferences.
  • Tích hợp với Jackson JSON, Gson hay những thư viện JSON khác với BaseJsonHttpResonseHandler.
  • Hỗ trợ cho viêc parser SAX với SaxAysnHttpResonseHandler.
  • Hỗ trợ nhiều ngôn ngữ với encoding nội dung không chỉ với UTF-8.

Cài Đặt & Sử Dụng

Add như maven dependency tơi file Gradle trong project của bạn.

dependencies { compile 'com.loopj.android:android-async-http:1.4.5' }

Import http package.

import com.loopj.android.http.*;

Tạo một AsyncHttpClient và một Request

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
	}
});

Trong ví dụ này chúng tôi sẽ tạo ra một class tĩnh làm nó dễ dàng cho việc giao tiếp với Twitter API.

import com.loopj.android.http.*;

public class TwitterRestClient {
  private static final String BASE_URL = "http://api.twitter.com/1/";

  private static AsyncHttpClient client = new AsyncHttpClient();

  public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
      client.get(getAbsoluteUrl(url), params, responseHandler);
  }

  public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
      client.post(getAbsoluteUrl(url), params, responseHandler);
  }

  private static String getAbsoluteUrl(String relativeUrl) {
      return BASE_URL + relativeUrl;
  }
}

Sau đó làm nó dễ dàng sử dụng trong code của bạn:

import org.json.*;
import com.loopj.android.http.*;

class TwitterRestClientUsage {
    public void getPublicTimeline() throws JSONException {
        TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                // If the response is JSONObject instead of expected JSONArray
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
                // Pull out the first event on the public timeline
                JSONObject firstEvent = timeline.get(0);
                String tweetText = firstEvent.getString("text");

                // Do something with the response
                System.out.println(tweetText);
            }
        });
    }
}

Bạn có thể tham khao về AsyncHttpClient, RequestParams or AsyncHttpResponseHandlerđể biết thêm chi tiết.

** Lưu trữ cookie với PersistentCookieStore ** Thư viện này cũng bao gồm PersistentCookieStore cho việc tự động lưu trữ cookie tới SharedPreferences trên thiết bị Android. Điều này rất hữu ích nếu như bạn muốn authentication khi người dùng muốn duy trì trạng thái login thậm chí sau khì đóng hay mở lại App cảu bạn. Đầu tiên tạo một AsynHttpClient:

AsyncHttpClient myClient = new AsyncHttpClient();

Sau đó tạo một ** PersistentCookieStore ** với Context là Activity or ApplicationContext.

PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
myClient.setCookieStore(myCookieStore);

Bất kỳ cookie nào được lấy về từ server sẽ được lưu trữ.

BasicClientCookie newCookie = new BasicClientCookie("cookiesare", "awesome");
newCookie.setVersion(1);
newCookie.setDomain("mydomain.com");
newCookie.setPath("/");
myCookieStore.addCookie(newCookie);

Bạn có thể tham khảo thêm PersistentCookieStore để biết thêm chi tiết.

GET/POST Parameters with RequestParams

Lớp RequestParams được dùng để thêm những parameter tới các request của GET/POST. RequestParams có thể được xây dựng trong cá các khác nhau.

  • Tạo một Requestparams trống sau đó thêm cá parameter.
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
  • Tạo một Requestparams với một parameter.
RequestParams params = new RequestParams("single", "value");
  • Tạo một Requestparams từ một HashMap của chuỗi key/value.
HashMap<String, String> paramMap = new HashMap<String, String>();
paramMap.put("key", "value");
RequestParams params = new RequestParams(paramMap);

Xêm thêm Requestparams Uploading Files với RequestParams RequestParams bổ sung việc hỗ trợ việc uppload ** multipart file** như bên dưới. Thêm một InputStream tới RequestParams cho upload:

InputStream myInputStream = blah;
RequestParams params = new RequestParams();
params.put("secret_passwords", myInputStream, "passwords.txt");

Thêm đối tượng File tới RequestParams:

 File myFile = new File("/path/to/file.png");
RequestParams params = new RequestParams();
try {
    params.put("profile_picture", myFile);
} catch(FileNotFoundException e) {}

Add byte array tới RequestParams để upload:

 byte[] myByteArray = blah;
RequestParams params = new RequestParams();
params.put("soundtrack", new ByteArrayInputStream(myByteArray), "she-wolf.mp3");

Downloading dữ liệu Binary FileAsyncHttpResponseHandler FileAsyncHttpResponseHandler là một lớp rất hữu ích cho việc lấy dữ liệu binary chẳng hạn như file image hay những file khác, ví dụ như sau :

 AsyncHttpClient client = new AsyncHttpClient();
client.get("http://example.com/file.png", new FileAsyncHttpResponseHandler(/* Context */ this) {
    @Override
    public void onSuccess(int statusCode, Header[] headers, File response) {
        // Do something with the file `response`
    }
});

Xem thêm FileAsyncHttpResponseHandler

0