2013-08-21 27 views
8

Tôi đang gặp phải một vấn đề rất khó hiểu đối với một số lượng rất nhỏ người dùng của mình. Lỗi xảy ra khi một nút được nhấn bên trong một Mảnh, bắt đầu một Hoạt động Phân đoạn khác. Dưới đây là stack trace:Hoạt động phân đoạn - ứng dụng đã chết, không có trạng thái đã lưu

I/20:22:23.901 ActivityManager(1668) 
Start proc com.brandall.nutter for activity com.brandall.nutter/.ActivityHomeFragment: pid=8956 uid=10125 gids={50125, 3003, 3001, 3002, 1015, 1023, 1006, 1028} 
I/20:22:23.881 WindowState(1668) 
WIN DEATH: Window{41ed1948 u0 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment} 
W/20:22:23.881 ActivityManager(1668) 
Force removing ActivityRecord{411c4188 u0 com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state 
I/20:22:23.881 WindowState(1668) 
WIN DEATH: Window{41b6a178 u0 Toast EXITING} 
W/20:22:23.881 InputDispatcher(1668) 
Attempted to unregister already unregistered input channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' 
W/20:22:23.871 ActivityManager(1668) 
Scheduling restart of crashed service com.brandall.nutter/.TTSS in 80000ms 
I/20:22:23.871 ActivityManager(1668) 
Process com.brandall.nutter (pid 8907) has died. 
I/20:22:23.871 WindowState(1668) 
WIN DEATH: Window{411d4ff0 u0 com.brandall.nutter/com.brandall.nutter.ActivityHomeFragment} 
E/20:22:23.871 InputDispatcher(1668) 
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Channel is unrecoverably broken and will be disposed! 
W/20:22:23.871 InputDispatcher(1668) 
channel '41ed1948 com.brandall.nutter/com.brandall.nutter.ActivityLinkAppsFragment (server)' ~ Consumer closed input channel or an error occurred. events=0x9 

Do dòng này của lỗi:

com.brandall.nutter/.ActivityLinkAppsFragment}: app died, no saved state 

Tôi đã đọc nhiều bài viết về bang Fragment lưu, nhưng không ai dường như áp dụng trong hoàn cảnh của tôi, chứ không phải cho chính Phân đoạn, không được đề cập trong theo dõi ngăn xếp. Các bài đăng khác đề xuất thêm vào từng Phân đoạn:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

Tôi hiện không ghi đè phương pháp onCreate trong bất kỳ đoạn nào của tôi.

Tôi cũng thấy đề nghị này thêm vào mỗi Fragment:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    setUserVisibleHint(true); 
} 

Ngoài thực tế là nó chỉ xảy ra với một số lượng rất nhỏ người dùng, vấn đề khó hiểu nhất là với bối cảnh sử dụng:

final Intent sa = new Intent(getActivity(), ActivityLinkAppsFragment.class); 
getActivity().startActivity(sa); 

Ứng dụng của tôi có dịch vụ nền trước và nếu tôi sử dụng bối cảnh tĩnh (thông qua phương thức getServiceContext tĩnh) trong Intent ở trên, sự cố không còn xảy ra đối với người dùng và Hoạt động phân đoạn mở chính xác .

Tôi không hiểu tại sao việc sử dụng một bối cảnh khác nên ngăn sự cố xảy ra, nhưng tôi hy vọng với thông tin tôi đã cung cấp, điều đó sẽ hợp lý với ai đó!

Tôi có thể cung cấp mã FragmentPagerAdapter mà tôi đang sử dụng nếu nó chứng minh là có liên quan, nhưng nó khá chuẩn.

tôi cảm ơn bạn trước

EDIT - Một cái gì đó rất quan trọng tôi quên thêm. Điều này không làm cho ứng dụng gặp sự cố. Thay vào đó là Hoạt động mà từ đó Phân đoạn được đưa vào, được khởi động lại ngay lập tức.

TRẢ LỜI - Điều này là do tôi gọi System.exit(0) trong những trường hợp tôi nghĩ chỉ có thể khi người dùng muốn 'xóa' mức sử dụng bộ nhớ của ứng dụng. Tôi đã sai và nó cũng có thể được gọi khi thiết bị của người dùng xử lý các điều kiện bộ nhớ thấp. @ Beworker của câu trả lời dưới đây được đánh dấu là chính xác, như ông lưu ý ActivityManagerService.handleAppDiedLocked() đó là kết quả của việc này.

+1

Điều này vẫn xảy ra nếu bạn sử dụng mẫu đề xuất đăng ký người nghe trong 'Hoạt động' và xử lý' startActivity' ở đó?'Fragments' sẽ không bao giờ bắt đầu ở đó sở hữu' Hoạt động' bởi vì không có cách nào để chúng biết được liệu một Activity nên được khởi động hay một Fragment sẽ được thêm vào/thay thế. Ngoài ra, tại sao bạn sử dụng 'Intent.FLAG_ACTIVITY_NEW_TASK' ở đây? –

+0

@PaulBurke Cờ không nên ở đó - Xin lỗi vì đã bị lỗi, nó bị bỏ lại trong thử nghiệm của tôi, tôi sẽ xóa nó khỏi câu hỏi. Khi tôi xử lý các hoạt động của mình như một đống rất đơn giản, tôi chưa bao giờ phải cân nhắc xem có nên bắt đầu chúng hay không. Tôi sẽ tìm kiếm cách tiếp cận người nghe mà bạn mô tả. Cảm ơn bạn. – brandall

+0

@brandall bạn có thể chia sẻ các phương thức 'onClick()' và vòng đời của Fragment không? –

Trả lời

10

Tôi đã xem mã nguồn Android cho thư trong theo dõi ngăn xếp và phát hiện ra rằng nó xuất phát từ phương pháp ActivityManagerService.handleAppDiedLocked(). Mô tả của phương pháp này cho biết "Chức năng chính để xóa một quy trình hiện tại khỏi trình quản lý hoạt động là kết quả của quá trình đó sẽ biến mất. Xóa tất cả các kết nối đến quy trình." Điều này xảy ra khi ứng dụng bị giết. Nó có thể bị hệ thống giết bởi ứng dụng khác (ví dụ: ứng dụng trình quản lý tác vụ) hoặc khi ứng dụng tự hoàn tất (ví dụ: System.exit(0)).

+0

Thú vị - điều đó sẽ giải thích số lượng rất nhỏ các vấn đề! Tôi sẽ đọc nó ngay bây giờ và kiểm tra với người dùng của tôi! Cảm ơn. – brandall

+0

Tôi đã kiểm tra với một vài người dùng của tôi với vấn đề này và họ không có một kẻ giết người nhiệm vụ được cài đặt ... Tôi đã thực sự hy vọng bạn đã đúng mặc dù! – brandall

+0

Bạn đã đúng - Không phải từ quan điểm của người dùng, nhưng từ việc triển khai của tôi trong ứng dụng. Tôi đã gọi System.exit (0); trong một số trường hợp nhất định mà tôi nghĩ sẽ không bao giờ bị xử tử - tôi đã sai, điều đó xảy ra, tôi cho rằng, dưới tải nặng ký ức. Đó là câu trả lời này liên kết hai - http://stackoverflow.com/a/14756126/1256219 Nếu bạn muốn cập nhật câu trả lời của mình với tham chiếu đến bài đăng đó và cách bạn biết đó là ActivityManagerService.handleAppDiedLocked() có liên quan, tôi ' sẽ đánh dấu nó là chính xác. Cảm ơn bạn! – brandall

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