12/08/2018, 17:54

Truy vấn Web Service không đồng bộ (Async Request) trong Android

Xin chào các bạn , hôm nay tôi xin hướng dẫn các bạn cách thực hiện truy vấn bất đồng bộ tới Web Service trong Android Trước tiên , đặt ra 1 câu hỏi : "Tại sao chúng ta lại cần thực hiện truy vấn bất đồng bộ đến Web Service ?" Câu trả lời đơn giản là đưa ra 1 ví dụ thực tế , giả sử các bạn cần ...

Xin chào các bạn , hôm nay tôi xin hướng dẫn các bạn cách thực hiện truy vấn bất đồng bộ tới Web Service trong Android

Trước tiên , đặt ra 1 câu hỏi : "Tại sao chúng ta lại cần thực hiện truy vấn bất đồng bộ đến Web Service ?"

Câu trả lời đơn giản là đưa ra 1 ví dụ thực tế , giả sử các bạn cần thực hiện một request lên Web Service , Web Service đó yêu cầu Token và Token được lấy từ Server cũng thông qua Web Service. Vậy tức là , làm gì thì làm , trước tiên tôi phải có Token đã , nếu không có Token thì request cái gì cũng failed ! Đó là lúc chúng ta cần Async Request , tức là , chỉ khi nào có Token , mới thực hiện tiếp những task còn lại , nếu không có Token thì báo lỗi để user xử lý

Vậy , trong Android , trước đây chúng ta có cách thực hiện đó là sử dụng AsyncTask để làm điều này

private class getToken extends AsyncTask{

        ProgressDialog mDialog;

        //Ctrl+O


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Khởi tạo dialog 
            mDialog = new ProgressDialog(MainActivity.this,android.R.style.Theme_DeviceDefault_Dialog);
            mDialog.setCancelable(false);
            mDialog.setMessage("Please wait");
            mDialog.show();
        }

        @Override
        protected Object doInBackground(Object[] objects) {
        //Thực hiện việc truy vấn về web Service
            HttpClient client = new HttpClient();
            client.get("http://test.com/token.php", new HttpResponseCallback() {
                @Override
                public void success(final String responseBody) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //Hide group waiting
                            group_waiting.setVisibility(View.GONE);
                            //Show group payment
                            group_payment.setVisibility(View.VISIBLE);

                            //Set token
                            token = responseBody;
                        }
                    });
                }

                @Override
                public void failure(Exception exception) {
                    Log.d("EDMT_ERROR",exception.toString());
                }
            });
            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            mDialog.dismiss();
        }
    }

Nhưng hôm nay , tôi muốn giới thiệu tới các bạn 1 cách ngắn gọn , đơn giản , tối ưu hơn ^^ Phù hợp cho cả Kotlin , đó là dùng thư viện Async HTTP Request

Bước 1 , vào Gradle (app module) , thêm đoạn sau để add AsyncHttpClient vào project của bạn

implementation 'com.loopj.android:android-async-http:1.4.9'

Bước 2 , thay thế class getToken mà kế thừa AsyncTask ở trên thành 1 hàm

private void getToken()
{

  //Khởi tạo dialog 
            mDialog = new ProgressDialog(MainActivity.this,android.R.style.Theme_DeviceDefault_Dialog);
            mDialog.setCancelable(false);
            mDialog.setMessage("Please wait");
            mDialog.show();
            
            
AsyncHttpClient client = new AsyncHttpClient();
//Ở đây vì API của tôi trả về String , ko phải Json nên tôi dùng TextHttpResponseHander
        client.get("http://test.com/token.php", new TextHttpResponseHandler() {
            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                      mDialog.dismiss();
                              Log.d("EDMT_ERROR",exception.toString());
            }

            @Override
            public void onSuccess(int statusCode, Header[] headers, String responseString) {
               mDialog.dismiss();
                       //Hide group waiting
                            group_waiting.setVisibility(View.GONE);
                            //Show group payment
                            group_payment.setVisibility(View.VISIBLE);

                            //Set token
                            token = responseBody;
                            
            }
        });
}

Xong , bạn có thấy việc implement một async request thật sự dễ dàng ^^ Hãy thử áp dụng nó cho dự án của bạn nhé ^^ Qua rồi thời viết code tràn giang đại hải ^^

0