8

Tôi không hoàn toàn hiểu được kinh doanh vòng đời mảnh vỡ này.Tại sao phân đoạn của tôi trênCreate được gọi rộng rãi bất cứ khi nào tôi trang thông qua ứng dụng của tôi viewPager?

Tôi có giao diện trang trình bày ngang trang ngang khá chuẩn 3 trang cho phần "chi tiết chế độ xem" của ứng dụng của tôi. Tôi bắt đầu ứng dụng của tôi trên trang giữa của ba. FragmentActivity tôi đặt trang để trang 1.

mPager.setCurrentItem(1); //default to center page, current data view fragment 

Tôi đã sử dụng các FragmentStatePagerAdapter vì sử dụng FragmentPagerAdapter đâm ứng dụng của tôi vào những thời điểm, khi trở lại từ trạng thái lơ lửng ví dụ, và đây là cách nhanh nhất để làm việc xung quanh cho đến bây giờ. Dường như làm việc nhưng tôi nghi ngờ khía cạnh nhà nước là những gì có thể là nguyên nhân của vấn đề của tôi ở đây, có thể. Vì vậy, lúc đầu, tôi nghĩ rằng tôi sẽ có từng mảnh làm công việc nhận dữ liệu từ một dịch vụ còn lại và sau đó hiển thị nó trong một danh sách, nhưng tôi không chắc chắn nữa.

Tôi đã thử chạy tác vụ không đồng bộ duy nhất để tìm nạp dữ liệu trong từng phân đoạn trên sự kiệnCreateView. Sau đó, sau khi đọc thêm về vòng đời mảnh tôi chuyển sang onCreate, đã nhận thấy rằng onCreateView đã được gọi khá nhiều, do đó được tạo cho một ứng dụng tham lam quá thường xuyên yêu cầu dữ liệu qua dây.

Chuyển đổi thành onCreate đã không thay đổi gì. OnCreate vẫn nhận được gọi là nhiều như onCreateView cho 2 đoạn liền kề.

Điều kỳ lạ là đoạn mà tôi đặt là đoạn đầu tiên hiển thị trong Hoạt động phân đoạn chỉ nhận được onCreate được gọi là một lần.

Điều gì đó không cảm thấy ngay tại đây.

Hiện tại tôi đang nghĩ rằng tôi nên có hoạt động phân đoạn gốc khai báo và gọi tất cả các tác vụ không đồng bộ để tìm nạp dữ liệu mà tôi cần hiển thị trong các đoạn. Đặt kết quả của cuộc gọi không đồng bộ trong một đối tượng thuộc sở hữu của hoạt động phân đoạn gốc và sau đó có các đoạn sử dụng đối tượng được cha mẹ chứa để tạo chế độ xem danh sách, v.v.

Nhưng điều gì sẽ xảy ra nếu tác vụ async bắt đầu bởi cha mẹ hoạt động không hoàn thành trước mỗi mảnh onCreateView được gọi và đối tượng chứa của phụ huynh là chưa sẵn sàng .....

ký, bối rối và thất vọng

Trả lời

25

ViewPager khá sốt sắng trong tắt điều nó hiện không sử dụng và đây chính xác là những gì đang xảy ra ở đây. Hành vi mặc định là dành cho ViewPager để "giữ lại" một trang ở hai bên của trang đang được xem và phá hủy phần còn lại. Do đó trong chế độ xem 3 trang của bạn, trang 3 bị hủy khi chọn trang 1, sau đó khi trang 2 được chọn lại trang 3 được tạo lại. Như bạn đã nhận thấy, trang 2 chỉ có onCreate(..) được gọi một lần bởi vì trang luôn ở bên cạnh hoặc trang hiện được chọn.

Để giải quyết vấn đề này, chỉ cần đặt ViewPager.setOffscreenPageLimit(2). Sau đó, ViewPager sẽ giữ tất cả các mảnh của bạn. Rõ ràng đây không phải là một ý tưởng tốt cho một số lượng lớn các mảnh vỡ, nhưng đối với trường hợp của bạn nó sẽ được sử dụng tốt.

+0

oh ya, nghe có vẻ hữu ích. vì vậy, hey, không bắn ra các nhiệm vụ không đồng bộ từ một đoạn onCreate có vẻ giống như một cách làm tiêu chuẩn? ngay bây giờ tôi bắn ra ba nhiệm vụ không đồng bộ riêng biệt khi hoạt động của tôi phân đoạn tải, đúng hay sai .... – topwik

+0

Vâng, vấn đề duy nhất tôi có khả năng nhìn thấy là nếu người dùng xoay thiết bị khi AsyncTask đang chạy. Tuy nhiên, tôi không có nhiều kinh nghiệm với họ. Có thể đáng để kiểm tra lớp AsyncTaskLoader, tôi tin rằng các lớp Loader tự động hóa rất nhiều thứ cho bạn. –

+0

Tôi cũng bị mắc kẹt trong vấn đề này. Bây giờ phải làm việc. Cảm ơn nhiều. – Durai

2

Giải pháp @ Espiandev sẽ hoạt động cho trường hợp hiện tại của bạn, nhưng bạn nói đúng là tiểu bang của bạn là vấn đề. Bạn nên sử dụng phương pháp setArgument và/hoặc onSaveInstanceState để tiết kiệm trạng thái của Fragment (điều này không quá khó, ví dụ:, phản hồi từ máy chủ thường có thể được biểu diễn dưới dạng Chuỗi) và sau đó sử dụng getArgument và/hoặc Bundle được chuyển vào onCreate để khôi phục.

Ngoài ra, bạn có thể có của bạn Activity làm server lấy về, và sau đó gọi setArgument cho mỗi mảnh vỡ của bạn, và kiểm tra các đối số bên Fragment của bạn để xác định xem dữ liệu của bạn đã đến chưa (và nếu không, có khả năng hiển thị một tải trạng thái của một số loại).

Nếu bạn quan tâm đến thay đổi hướng màn hình, this related question cũng sẽ hữu ích cho bạn.

+0

cảm ơn, người đàn ông. tôi đánh giá cao phản ứng. tôi muốn theo dõi, "nếu tôi có nhiều mảnh vỡ hơn trong máy nhắn tin này" .... – topwik

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