2011-04-20 39 views
9

Khi ứng dụng của tôi chuyển sang nền, các đối tượng (tĩnh và đơn) của tôi sẽ bị xóa. Vì vậy, tôi đã cố gắng lưu trữ các đối tượng này trong Ngữ cảnh áp dụng. Tôi đang sử dụng mã sau đây.Lưu trữ các đối tượng trong ApplicationContext

Accounts.create (getApplicationContext()) sẽ được gọi một lần để lưu trữ cá thể tài khoản.

Có thể (đáng tin cậy) để lưu trữ các đối tượng trong ngữ cảnh ứng dụng không? Tôi không chắc chắn cách sau đây là đúng hay không. vui lòng hướng dẫn ..

public class Init extends Application { 
    private Hashtable<Object, Object> globalStore = new Hashtable<Object, Object>(); 

    public void putToGlobalStore(Object key, Object value) { 
     globalStore.put(key, value); 
    } 

    public Object takeFromGlobalStore(Object key) { 
     return this.globalStore.get(key); 
    } 

    public void removeFromGlobalStore(Object key) { 
     this.globalStore.remove(key); 
    } 

    public boolean containsInGlobalStore(Object key) { 
     return this.globalStore.containsKey(key); 
    } 
} 

public class Accounts { 

     protected Accounts(String name, Context context) { 
      Init init = (Init) applicationContext; 
       init.putToGlobalStore(name, this); 
     } 

     private static Init applicationContext; 

     public static void create(Context context) { 

      if (context instanceof Application) 
       applicationContext = (Init) context; 
      else 
       applicationContext = (Init) context.getApplicationContext(); 

      if (applicationContext.containsInGlobalStore(GLOBAL_NAME)) 
       Logger.log("Warning " + GLOBAL_NAME 
         + " is already created. This will remove all old datas"); 

      new Accounts(GLOBAL_NAME, applicationContext); 


     } 

     private static final String GLOBAL_NAME = "accounts"; 

     public static Accounts getInstance() { 

      try { 
       return (Accounts) applicationContext 
         .takeFromGlobalStore(GLOBAL_NAME); 
      } catch (Exception e) { 
       Logger.log("GLOBAL_NAME Lost"); 
       return null; 
      } 

     } 

Xin vui lòng trợ giúp.

Trả lời

11

Bạn nên biết rằng bối cảnh ứng dụng riêng của mình bị phá hủy nếu không sử dụng trong một thời gian dài ở chế độ nền. Vì vậy, không có gì đảm bảo rằng các đối tượng tĩnh và đơn của bạn sẽ không bị xóa khi ứng dụng ở chế độ nền. Thay vào đó, những gì bạn có thể làm là duy trì các đối tượng của bạn theo thời gian (trong tệp phẳng hoặc sở thích hoặc cơ sở dữ liệu được chia sẻ) và khôi phục chúng theo phương thức onCreate của lớp Ứng dụng

1

Application clas s không phải là vĩnh viễn.

Nếu quá trình ứng dụng bị hủy, mất lớp dữ liệu biến thành viên lớp ứng dụng.

Using Shared Preferences.

+0

Cảm ơn bạn đã trả lời. Những gì tôi cần là lưu trữ dữ liệu thông qua ứng dụng khi nó đang chạy –

2

Tôi đã sử dụng phương pháp này trong ứng dụng của mình và tôi không thấy bất kỳ vấn đề nào trừ khi quá trình của tôi bị hệ điều hành giết hoặc nếu có sự cố trong ứng dụng của tôi và ứng dụng của tôi sẽ được khởi động lại.

Nếu bạn cho rằng bất kỳ dữ liệu nào bạn đang lưu trữ chỉ hợp lệ cho thời gian sống của chương trình, tại sao bạn không ghi đè lên đối tượng OnCreate of Application và tạo tất cả các đĩa đơn của bạn ở đó. Bằng cách này, bạn luôn có thể đảm bảo rằng ứng dụng của bạn có tất cả các đĩa đơn trước khi ứng dụng của bạn bắt đầu hoạt động.

+0

Có Tôi đang thực hiện khởi tạo trong ứng dụng onCreate(). Nhưng sau một thời gian khi ứng dụng ở chế độ nền, tôi nhận được cá thể của đối tượng (nói Tài khoản), nhưng tất cả các dữ liệu được lưu trữ trong đối tượng sẽ bị xóa. Điều thú vị là tôi có thể mô phỏng vấn đề này trong 2.3.3, không phải trong mọi thiết bị –

+1

Bạn có thể đã thử điều này rồi, nhưng nếu bạn không có lý do tại sao bạn không ghi đè lên phương thứcDestroy và thêm một số đăng nhập vào đó để xem khi nào đối tượng đang bị phá hủy. Ngoài ra, thêm một số đăng nhập vào onCreate của bạn và phương thức mà bạn đang lưu trữ đối tượng tài khoản trong bảng băm vv .. Ngoài ra một điều nữa nó có thể không liên quan, nhưng nếu đối tượng này được sử dụng từ các chủ đề mutliple, sử dụng ConcurrentHashMap thay vì HashMap . Hãy cho tôi biết wat bạn thấy vui khi được giúp :) – Naresh

0

Tôi biết câu hỏi này đã được hỏi một thời gian dài trước đây, nhưng đây là một good article cho thấy việc sử dụng đối tượng Ứng dụng để lưu trữ dữ liệu thường không phải là phương pháp thiết kế âm thanh.

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