2013-04-12 45 views
19

Ứng dụng của tôi bị treo sau khi không hoạt động trong một thời gian dài ở chế độ nền. Tôi đã sửa lỗi và tìm thấy lý do khiến nó bị lỗi là do NullPointerException. Ngoại lệ là do thực tế là dữ liệu trong lớp đơn ứng dụng bị phá hủy bởi bộ thu gom rác khi ứng dụng ở chế độ nền. Tôi đang sử dụng dữ liệu tĩnh trong mỗi hoạt động trong suốt ứng dụng của mình.Ứng dụng gặp sự cố khi khôi phục nền sau một thời gian dài

Câu hỏi của tôi là: có cách nào để làm cho dữ liệu của lớp ứng dụng liên tục khi ở chế độ nền không? Hoặc có giải pháp nào khác không?

+0

Xem http://developer.android. com/reference/android/app/Activity.html # onSaveInstanceState (android.os.Bundle) –

Trả lời

13

Để có câu trả lời chính xác hơn, bạn đặt mã của mình tại đây. Bật, bộ nhớ Android bị giới hạn vì vậy VM có thể loại bỏ bất kỳ đoạn mã nào mà nó nghĩ là không cần thiết.

Nhìn vào phương pháp vòng đời hoạt động, đặc biệt vào onResume và đảm bảo rằng bạn hiểu điều đó một cách hoàn hảo. Vì vậy, nhiều ứng dụng thời gian bị treo chỉ vì không sử dụng phương pháp vòng đời hoạt động đúng cách.

Một xem xét thiết kế quan trọng khác cho Hoạt động là, bất kể điều gì xảy ra với dữ liệu liên tục, bạn Hoạt động sẽ hiển thị giao diện người dùng của nó với một số giá trị mặc định. Giả sử là như thế này, nếu tôi có dữ liệu tôi sẽ hiển thị nếu tôi không, tôi thực sự không quan tâm. Giao diện người dùng của bạn sẽ không bao giờ bị lỗi có hoặc không có dữ liệu. Bạn có thể sử dụng String.xml để lưu trữ một số giá trị mặc định hoặc thậm chí trong bố cục.

nếu bạn vẫn muốn đi với lớp singleton, điều này hoàn toàn ổn nhưng hãy đảm bảo bạn thực hiện kiểm tra sau mỗi khi bạn cố gắng truy cập vào singleton của mình.

if (instance==null) 
    instance=Singleton.getInstance() 

phương pháp getInstance() của bạn không chỉ trả lại cho bạn ví dụ hiện tại nó cũng sẽ đảm bảo rằng

  • nó khởi tạo tất cả đối tượng và biến
  • phương pháp singleton khác như phương pháp dụ

Đỗ không truy cập dữ liệu tĩnh từ một Hoạt động sang một Hoạt động khác. Nó không phải là tốt cho android đặc biệt cho các vấn đề loại bạn đang phải đối mặt bây giờ và nó cũng không phải là rất tốt thực hành lập trình OOP.

SharedPreference là cách tốt để duy trì dữ liệu, nếu đáp ứng yêu cầu của bạn, hãy truy cập dữ liệu đó.

nếu bạn muốn chuyển dữ liệu từ thành phần Android khác nhau như Hoạt động, Dịch vụ hoặc BroadcastReciever, bạn có thể đặt nó bên trong một gói và gửi theo ý định. Và, như mọi khi là họ lưu trữ dữ liệu SQLLite, nộp IO vv vv

+0

cảm ơn câu trả lời của bạn minhaz, bạn đã mô tả rất chính xác. –

+1

+1 cho "Giao diện người dùng của bạn sẽ không bao giờ gặp sự cố có hoặc không có dữ liệu". – OneThreeSeven

0

Cố gắng tránh sử dụng các biến tĩnh trong ứng dụng của bạn đang gây ra các loại vấn đề. Hãy thử lưu dữ liệu của bạn trong Tùy chọn được chia sẻ và sử dụng nó.

1

Nếu bạn có thể, lưu trữ nó bằng các phương pháp khác. Nếu cấu trúc dữ liệu phức tạp của nó, bạn có thể phải khởi động lại ứng dụng. Ví dụ, tôi có một Singleton người dùng trong ứng dụng của tôi chứa thông tin đăng nhập cho máy chủ của tôi. Tôi không thể cứu chúng nếu tôi cố gắng - rất nhiều dữ liệu được ẩn trong các biến AWS. Những gì tôi phải làm là phát hiện khi chúng tôi được khởi chạy lại từ trang chủ sau khi được dọn dẹp (thay vì chỉ được khởi động lại) và khởi động hoạt động bắt đầu của tôi, sau đó kết thúc hoạt động hiện tại. Và tôi phải thêm điều đó vào mọi hoạt động trong ứng dụng của mình.

+3

Bạn đã phát hiện ra điều đó bằng cách nào? – AlvaroSantisteban

0

Các hoạt động là không còn có thể nhìn thấy thats tại sao nó sẽ onStop() thay vì onResume()

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