Hồi mình bắt đầu dev android, cứ mỗi lần cần request xài httpclient, mình lại viết mới 1 class asynctask để sử dụng, 1 hôm rảnh rỗi ngồi review code, mình nghĩ xem có cách nào viết chung 1 class không, mỗi lần sau chỉ cần truyền vào các tham số là xài đc.


Mình tạo một cái interface như này, cái này sẽ ref ngược về chỗ gọi asynctask khi kết thúc hàm


public interface HandlerProcess {
    void onComplete(boolean success, T result);
}


Mình tạo tiếp 1 abstract class asynctask xài chung, đọc code sẽ thấy

  • Đầu vào: Mình không truyền cụ thể tham số hay chi tiết gì, mình sẽ tạo 1 abstract method, cái này là nội dung hàm xử lý (mình sẽ override hàm này tại class gọi).
  • ProgressDialog: dialog xuất hiện khi ta chạy xử lý
  • HandlerProcess: cái interface vừa tạo ở trên, nó sẽ gọi khi kết thúc

public abstract class AsyncProcess extends AsyncTask<Void,Void,T> {
    private Exception exception;
    private HandlerProcess handlerProcess;
    protected abstract T executeMethod();
    protected ProgressDialog progressDialog;

    public AsyncProcess(HandlerProcess handlerProcess, ProgressDialog progressDialog){
        this.handlerProcess = handlerProcess;
        this.progressDialog = progressDialog;
    }

    @Override
    protected void onPreExecute() {
        if(progressDialog!=null)
            progressDialog.show();
    }

    @Override
    protected T doInBackground(Void... params) {
        try{
            return executeMethod();
        }catch (Exception e){
            this.exception = e;
            return null;
        }
    }

    @Override
    protected void onPostExecute(T t) {
        if(progressDialog!=null && progressDialog.isShowing()){
            progressDialog.dismiss();
        }
        handlerProcess.onComplete(exception == null,t);
    }
}



Và bây giờ là việc sử dụng, ở tại class bất kì:
- Mình khai bao 1 đối tượng của HandlerProcess:

HandlerProcess handlerProcess = new HandlerProcess() {
    @Override
    public void onComplete(boolean success, JSONObject result) {
        if(success&&result!=null){
           //process success no error
        }else {
           //process success with error
        }
    }
};



- Và khai báo tiếp đối tượng asyntask

AsyncProcess asyncProcessCheckToken = new AsyncProcess(handlerProcess,null) {
    @Override
    protected JSONObject executeMethod() {
        //do something
    }
};
asyncProcessCheckToken.execute();



Vậy là bạn đã có 1 class asynctask xài đc bất kì chỗ nào luôn rồi phải ko, đỡ mất thời gian phải viết những mã giống nhau.