2013-10-25 20 views
12

Tôi đang mở rộng AsyncTaskLoader mà tôi sử dụng sau này trong một Fragment thông qua LoaderManager. Có cách nào được đề xuất để xử lý các lỗi xảy ra trong khi thực hiện tác vụ không đồng bộ không? Tôi muốn bật thông báo yêu cầu người dùng hủy hoặc thử lại khi lỗi kết nối internet xảy ra.Cách xử lý lỗi trong AsyncTaskLoader tùy chỉnh?

Cách duy nhất mà tôi có thể nghĩ bây giờ là làm cho Trình tải trở về null khi lỗi hoặc nạp đối tượng đã tải vào một đối tượng khác có mã trạng thái.

+0

Bạn đã bao giờ nhận được bất kỳ đâu với điều này? Tôi đang chạy vào cùng một vấn đề bây giờ mà tôi không có giá trị trả về từ 'AsyncTask'' doInBackground' nữa để kiểm tra. – theblang

+0

Tôi sử dụng câu trả lời for3st. – Malachiasz

Trả lời

16

Những gì chúng ta đã làm trong dự án cuối cùng của chúng tôi: Tạo một Wrapper chứa một chung và một excpetion như thế này:

public class AsyncTaskResult<T> { 
    private final T result; 
    private final Exception error; 
    //getter & setter 
} 

Catch tất cả các trường hợp ngoại lệ trong doInBackground(...) của bạn và đóng gói chúng vào wrapper kết quả (hoặc kết quả nếu không có lỗi). Trong giao diện người dùng của bạn, hãy kiểm tra trình bao bọc nếu đó là ngoại lệ, sau đó hiển thị theo thông báo lỗi, nếu không thì hãy điền vào các trường có kết quả. Đối với chúng tôi nó cũng là thực hành tốt để xác định những loại ngoại lệ duy nhất, có (ví dụ như ngoại lệ với một lỗi có thể phục hồi mà bạn chỉ hiển thị một hộp thoại hoặc một lỗi ứng dụng mà bạn cần phải kick người dùng vào menu chính). và chỉ ném các loại này (bắt được cụ thể trong asynctask của bạn), vì vậy bạn không phải bận tâm với hàng trăm trường hợp ngoại lệ khác nhau và cũng trừu tượng xử lý lỗi của bạn. Bạn cũng có thể cung cấp các khóa String với thông báo lỗi I18n chính xác để bạn chỉ phải viết e.getMessage()

+0

Thực hành tốt, đã làm như vậy –

+0

Tôi đã thực hiện việc này: 'MyLoader mở rộng AsyncTaskLoader >' Bạn cũng có thể sử dụng 'Bundle' và có khóa cho các lỗi, nếu tất cả dữ liệu của bạn thực hiện' Parcelable' . –

+0

Đọc có liên quan: http://tech.puredanger.com/2010/03/31/do-we-want-a-java-util-pair/ – for3st

1

Tôi đã thấy kết quả tốt khi trả về đối tượng hỗn hợp chứa tải trọng (nếu có) và mã trạng thái, như bạn đã đề xuất. Sau đó, Fragment lưu trữ số AsyncTaskLoader có thể hiển thị lỗi thích hợp và mang tính thông tin. Cách tiếp cận này có thêm lợi thế là nó sử dụng vòng đời của trình nạp sẵn.

Một tùy chọn khác là đăng ký người nghe rằng AsyncTaskLoader của bạn sẽ thông báo khi có lỗi xảy ra. Facebook SDK có ví dụ về cách sử dụng trình nghe lỗi với trình tải.

Các vấn đề liên quan