2011-12-14 19 views
6

tôi đang làm việc trên một ứng dụng bao gồm một vài hoạt động:Biến tĩnh thực sự an toàn để trao đổi dữ liệu giữa các hoạt động?

  • Hoạt động 1: Màn hình chính của ứng dụng với một nút "Start"
  • Hoạt động 2: dùng chọn bản sắc của mình từ danh sách (nhiều người dùng sẽ sử dụng các ứng dụng)
  • Hoạt động 3: hướng dẫn đầu vào mật khẩu
  • Hoạt động 4: dùng chọn một sự kiện từ một thời gian biểu (mỗi người dùng có thời gian biểu riêng của mình với các sự kiện liên quan)
  • Hoạt động 5 : người dùng có thể chọn một hành động c được phát hiện với một hoạt động.
  • Hoạt động 6-10: người dùng thực hiện hành động thích hợp.

Dưới đây một số thông tin hơn:

  • mọi hoạt động 6-10 đã biết những gì người dùng đang đăng nhập và những gì sự kiện đã được chọn
  • mọi hoạt động 6-10 có một menu cho phép người dùng quay lại hoạt động: 1 (để đăng xuất), 4 (để chọn sự kiện khác), 5 (để chọn hành động khác)

Kể từ bây giờ, tôi đã sử dụng gói để trao đổi dữ liệu giữa hoạt động nhưng nó có vẻ phức tạp mã như số lượng hành động phát triển (một số hành động sử dụng 3-4 hoạt động để thu thập dữ liệu từ người dùng). Việc chuyển tất cả dữ liệu đến mọi hoạt động đã tạo dường như không được tốt đẹp.

Tôi đang suy nghĩ về việc lưu trữ "tên người dùng" và "sự kiện" đã chọn làm trường tĩnh của một lớp. Tôi sẽ đơn giản hóa mã rất nhiều, nhưng tôi không chắc chắn liệu dữ liệu này sẽ tồn tại nếu người dùng cho phép tại một số điểm nhấn "nút home" và chạy một ứng dụng khác cần nhiều bộ nhớ.

Dữ liệu được lưu trữ trong các trường tĩnh có an toàn không?

Trả lời

2

No. Bạn không được đảm bảo rằng tất cả sẽ tồn tại trong cùng một trình nạp lớp, trong trường hợp này bạn sẽ xử lý các bản sao khác nhau của các lớp này ở những nơi khác nhau và không truy cập cùng một trạng thái được chia sẻ.

Nó có thể xảy ra ngay bây giờ; nhưng không có nó không phải là một cái gì đó tôi sẽ gọi là "an toàn".

+0

Bạn có ý nghĩa gì với "trong cùng một trình nạp lớp"? Tôi nghĩ rằng chỉ có một bản sao của lớp có sẵn cho toàn bộ ứng dụng. – Ashwin

+0

Không, hai phiên bản 'Hoạt động' khác nhau không được đảm bảo nằm trong cùng một' Lớp tải '. Họ sẽ có hai bản sao sau đó. Ngoài ra, trong một 'Activity',' Class' có thể thay đổi theo thời gian: hệ điều hành được tự do gỡ bỏ ứng dụng của bạn trong 'onDestroy()', và tạo một 'ClassLoader' mới và nạp lại nó. –

+0

Điều gì sẽ xảy ra nếu tôi lưu trữ các vairables của tôi trong một lớp mở rộng Ứng dụng? Nó sẽ tốt hơn "tĩnh"? – Ashwin

-1

Bạn có thể sử dụng tĩnh trừ khi và cho đến khi bạn chắc chắn rằng biến tĩnh này sẽ không xung đột với người dùng. cũng biến tĩnh là thuộc tính của lớp nên nó tiêu thụ nhiều bộ nhớ hơn vì tuổi thọ là mức ứng dụng. khác tôi có thể đề nghị là sử dụng chia sẻ thích mà rất tiện dụng. tùy chọn chia sẻ này có thể được truy cập bởi bất kỳ hoạt động nào trong ứng dụng của bạn. vì vậy không cần phải vượt qua bó và lo lắng về các trường tĩnh. tùy chọn cuối cùng là tôi không thấy tầm quan trọng trong ứng dụng của bạn là "Sử dụng cơ sở dữ liệu để lưu trữ và truy xuất".

Hy vọng điều này sẽ hữu ích.

+0

@ Khan Khan xin lỗi tôi đã nhập thực sự. tôi nghĩ rằng ans của tôi là tốt. –

1

bạn có thể sử dụng SharedPreference cho mục này thay vì sử dụng biến tĩnh/đối tượng vào lớp. hãy xem blog này http://android-er.blogspot.com/2011/01/example-of-using-sharedpreferencesedito.html

+0

Thử lưu trữ một đối tượng phức tạp trong SharedPreference. –

+2

không phải là SharedPreferences được thiết kế để lưu trữ dữ liệu liên tục? – kmalmur

+0

kiểm tra bài đăng này để sử dụng biến tĩnh http://stackoverflow.com/q/7763864/760489 – Pratik

0

Các trường tĩnh hoạt động nhưng không có hiệu quả. Bạn chỉ cần một đối tượng phiên sau mẫu đơn.

+0

thực sự, tôi tin rằng người độc thân có thể bị giết bất cứ lúc nào, và nó không phải là rất an toàn để làm như vậy. điều này có thể giới thiệu một TON lỗi lạ, và rất khó để theo dõi –

5

Tốt hơn nên có đối tượng Ứng dụng tùy chỉnh và lưu trữ chúng ở đó. Đối tượng ứng dụng sẽ sống lâu như ứng dụng của bạn.

http://developer.android.com/reference/android/app/Application.html

Bạn có thể được tiếp cận với các đối tượng ứng dụng bằng cách đúc getApplicationContext() để bất cứ điều gì bạn Loại ứng dụng tùy chỉnh là:

public class CustomApplication extends Application { 
    private String userId; 

    public void onCreate() { 
     super.onCreate(); 
     ... 
    } 

    public String getUserId() { 
     return userId; 
    } 

    ... 
} 

Từ gọi Hoạt động: ((CustomApplication) getApplicationContext()).getUserId();

+1

có vẻ là một giải pháp tốt, nhưng nếu hệ thống sẽ giết ứng dụng của tôi (ví dụ như bộ nhớ sẽ cần cho một ứng dụng khác)? Sau khi quay lại ứng dụng của tôi, ứng dụng của tôi có bắt đầu ngay từ đầu hoặc hệ thống sẽ khởi chạy hoạt động mới nhất không? – kmalmur

+0

Nếu bạn cũng kiên trì dữ liệu thì tôi khuyên bạn nên tạo đúng thiết kế cho ứng dụng của mình trước khi chạm vào ** bất kỳ mã ** nào. –

0

dữ liệu tĩnh sẽ kéo dài nhấn nút home và mở ứng dụng của bạn một lần nữa bạn sẽ đi đến trạng thái tương tự, nơi bạn còn lại nhưng khi bạn chạy một ứng dụng khác mà cần nhiều bộ nhớ có khả năng mà bạn có thể bị mất t tất cả các dữ liệu tĩnh của bạn. Nhưng nếu bạn có ít dữ liệu tĩnh hơn thì nó có thể vẫn tồn tại.

Bạn cũng có thể tìm SharedPreference.

+1

Điều gì xảy ra khi bạn lưu các biến của mình trong một ứng dụng mở rộng lớp? Có khả năng mất dữ liệu này khi một ứng dụng khác cần nhiều bộ nhớ không? – Ashwin

0

Bạn chỉ nên sử dụng hệ thống mục đích như được thiết kế. Thống kê và hoạt động có thể bị Android giết chết dường như. Ngay cả lớp Ứng dụng cũng có thể bị giết.

Giả sử bạn có một ứng dụng bao gồm hai hoạt động, ứng dụng đầu tiên cho phép người dùng lưu trữ một số dữ liệu trong đối tượng Ứng dụng. Sau đó, người dùng nhấp vào nút để bắt đầu hoạt động thứ hai hiển thị dữ liệu. Người dùng đặt điện thoại của họ xuống và quay lại với nó vài giờ sau đó.

Android có thể quyết định giết ứng dụng vì nhiều lý do khác nhau trong thời gian này. Khi người dùng quay lại, nhấc điện thoại lên và khởi động lại ứng dụng của bạn, một đối tượng Application mới sẽ được tạo và hoạt động thứ hai sẽ được khôi phục nhưng dữ liệu người dùng nhập sẽ không còn trong đối tượng Application vì nó là đối tượng Application mới .

Một cách để giúp điều này là sử dụng SharedPreferences ngay cả đối với các đối tượng phức tạp. Gson hoàn toàn có khả năng serializing và deserializing chúng để SharedPreferences.

Để mô phỏng điều này, bạn có thể thực hiện như sau:

$ adb shell ps | grep your.app.package

để có được pid của ứng dụng đang chạy của bạn, sau đó

$ adb shell kill -9

sau đó mở ứng dụng với tiện ích chuyển nhiệm vụ và bạn sẽ có một đối tượng ứng dụng mới nhưng sẽ tham gia hoạt động thứ hai.

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