Kỹ thuật "Callback"


Từ: 17:20 23/09/2012
Bài: 3
Cảm ơn: 2
Thích: 0

Xin chào các các bạn!

Hôm nay mình sẽ đưa ra một vấn đề để mọi người cũng thảo luận:

- Một Prj android cần phải làm việc với server( đơn giản là tạo các request http để lấy các chuỗi json từ srv về)

- Do Prj cũng khá lớn chúng ta đã tách riêng các công việc làm việc với svr ra class Api.class, trong class này sẽ có các phương thức làm kiểu như: login, getAllProducts, .....Tất nhiên chúng không phải là những phương thức chạy đồng bộ, mỗi phương thức có thể được chạy ở một tiến trình riêng(làm việc với mạng mà)

Vấn đề: Làm sao t có thể lấy về kết quả của những phương thức trong class Api? ví dụ như login kết quả trả về sẽ là ok || not ok

*** một hướng đơn giản là tạo các tiến trình ngay ở chỗ cần kết quả trả về : và class Api sẽ không chứa các phương thức bất đồng bộ mà các phương thức sẽ chỉ là nội dung của công việc, nhưng cách này sẽ làm prj của bạn trở nên khó kiểm soát hơn, và class Api không còn đúng với ý nghĩa của nó nữa.

Vậy còn giải pháp nào nữa cho vấn đề này?

Label
Từ: 12:10 27/09/2012
Bài: 155
Cảm ơn: 178
Thích: 28

Trong Android thì không biết, còn PHP minh hay dùng cơ chế Event Listener.

Cơ chế này thì dùng Observer Pattern, gom tât cả các Event cần Listen lại. Nhưng hiện tại sử dụng do Framework cung cấp sẵn, bạn có thể nghiên cứu cái đó để tạo ra 1 bộ Event Manager riêng.

Label
Từ: 14:36 04/10/2012
Bài: 81
Cảm ơn: 82
Thích: 7

Làm callback "devil" như js thôi :D

với js thì

user.login(username, password, function(result) {

// xử lý result là kết quả login có thành công hay ko

});

nội tại thân hàm sẽ login và trả về kết quả bằng cách gọi callback với tham số result :D

Để implements bằng Android cũng ko khó vì nó cũng là java thôi. Có thể triển khai bằng 1 interface giống ActionListener hoặc extends interface này luôn cũng được. Khi viết callback có thể dùng anonymous class hoặc tạo 1 class cụ thể để xử lý sự kiện

Label
Từ: 17:20 23/09/2012
Bài: 3
Cảm ơn: 2
Thích: 0

Các fiter nói rất chuẩn.

Fiter @tut4rever nói và làm ví dụ bằng js cmnr. Callback - "Mày không cần quan tâm đến tao, khi nào t làm xong t sẽ gọi lại cho mày"

Để xử lý vấn đề này thì t thường xây dựng một interface tại lớp API (trong bài toán t đang đề cập) có chức năng làm callback - hay actionListener. Khi đó phương thức login sẽ được viết như thế này

login(string uid, string pwd, MyCallback cb){ //MyCallback  là tên interface của t

      string json = "";

      // xử lý lấy data từ svr (có thể dùng asynctask để biết khi nào tiến trình kết thúc)

     // khi task kết thúc json = data; cb.onAction(json);

}

Tại class cần dùng phương thức login này thì cần phải implement(s) các callback của class api( có thể implement theo class hoặc inline - cách này có vẻ tiện hơn)

btnLogin.setOnClickListener(new OnClickListener(){

     onClick(View v){

       //show dialog

      //validate input data

      Api.login(uid, pwd, new MyCallback(){

             onAction(Data data){

              // xử lý data

             // tắt dialog

             }

      })

     }

});

 

Khá thú vị, ai có đề tài gì hay thì bỏ lên đây ace chia sẻ cùng mọi người cho vui :)