7

Tôi đã bị bối rối với điều này trong một thời gian. Tôi đang làm việc trên một ứng dụng Android lưu trữ sản phẩm khai thác cá của một người, các địa điểm câu cá yêu thích, kiểm kê hộp và các dữ liệu khác. Tất cả các lớp của tôi đều có thể Serializable và có thể lưu và nạp giữa các hoạt động mà có vẻ như đang hoạt động. Nhưng tôi dự đoán là ngày càng có nhiều dữ liệu được lưu trữ, ứng dụng sẽ bắt đầu chạy chậm.Hiệu quả truyền dữ liệu đối tượng tùy chỉnh giữa các hoạt động Android [Mono Android]

Những gì tôi về cơ bản hỏi là có cách nào để giữ lại dữ liệu này trong toàn bộ ứng dụng, vì vậy tôi không phải tải nó mỗi khi một màn hình mới bật lên. Tôi đã tìm thấy các thông tin sau đây để giúp đỡ, nhưng nó cần phải được một chút rõ ràng hơn cho tôi hiểu:

diễn đàn khác nói bạn có thể nhét nó trong đối tượng Application:

[Application] 
public class MyApp : Android.App.Application { 
    public MyApp(IntPtr handle) 
     : base (handle) 
    { 
    } 

    public FishingData Data {get; set;} 
} 

Sau đó, trong vòng của bạn hoạt động:

((MyApp) this.ApplicationContext).Data = value; 

Vì vậy, tôi đã không bao giờ thực sự nghe nói về làm phương pháp này trước và tôi không chắc chắn điều này sẽ sống trong suốt quá trình ứng dụng (tôi cảm thấy như một trong hai cách nó sẽ phải tải dữ liệu thông qua Đây là những gì tôi muốn các ứng dụng cần làm:

Hoạt động đầu tiên là menu chính và sau đây phải được thực hiện khi tải màn hình:

  1. Nếu một tập tin cài đặt được tìm thấy, sử dụng serialization để tải một đối tượng FishingData trước (Tôi biết làm thế nào để làm điều này)
  2. Nếu không, sau đó tạo đối tượng FishingData sạch mới để lưu sau này (Tôi cũng biết điều này)
  3. Vì vậy bây giờ chúng tôi có đối tượng FishingData, làm cách nào để đảm bảo rằng tôi không phải lặp lại các bước 1 -2 trong mọi hoạt động. Làm thế nào tôi có thể bằng cách nào đó vượt qua các đối tượng FishingData đến hoạt động tiếp theo và đảm bảo rằng nó sống globaly trong khi các ứng dụng vẫn còn sống. Tôi chỉ muốn tải nó một lần (thông qua serializing) (< - Không biết cách thực hiện) và lưu nó chỉ khi người dùng thêm dữ liệu vào đối tượng này (mà tôi biết cách thực hiện).

Mọi trợ giúp sẽ được đánh giá cao. Đây là bugging tôi tôi cant dường như con số này ra. Điều này có vẻ như nó sẽ là một điều phổ biến để làm nhưng tôi đã không có bất kỳ may mắn tìm thấy bất kỳ thông tin chi tiết.

+0

Tôi không biết, nhưng +1 cho câu hỏi đầu tiên được định dạng cực kỳ tốt. Chào mừng bạn đến với StackOverflow. –

+0

Để chuyển thông tin giữa các hoạt động, bạn muốn sử dụng Parcelable http://developer.android.com/reference/android/os/Parcelable.html Tuy nhiên, để lưu tất cả dữ liệu này, tối ưu bạn sẽ tạo ít nhất một cơ sở dữ liệu sqllite, hoặc lý tưởng hơn là sử dụng cơ sở dữ liệu của riêng bạn – Jameo

+0

Kiểm tra http://forums.xamarin.com/discussion/451/communicate-with-iserializable – Cheesebaron

Trả lời

1

Bạn có thể sử dụng phương pháp này, nó sẽ hoạt động miễn là đối tượng Application của bạn còn sống (Có nghĩa là sẽ trực tiếp thông qua toàn bộ ứng dụng và hoạt động của bạn). Bạn có thể đọc thêm về cách sử dụng các biến toàn cục được lưu trữ trong đối tượnghere. Tôi không nghĩ rằng mono sẽ tạo ra một sự khác biệt mà sẽ ngăn cản bạn sử dụng cách tiếp cận này.

+0

Cảm ơn, tôi đã thử nghiệm nó bằng các bước từ liên kết ở trên và bây giờ nó đang giữ thành công một biến toàn cầu được lưu trữ trong suốt các hoạt động. Cảm ơn sự giúp đỡ của bạn, đây là một trọng lượng rất lớn ngoài vai tôi. – TeamChillshot

+0

Vui vì nó đã giúp :) Vui lòng đánh dấu câu hỏi là đã được giải quyết: http://stackoverflow.com/faq#howtoask – Jong

+1

Đối tượng ứng dụng được đảm bảo được tạo trước tất cả các hoạt động của bạn và được lưu giữ cho đến khi tất cả các hoạt động của bạn bị hủy. Bạn không thể sử dụng nó cho nhà nước toàn cầu mặc dù bởi vì Android có thể phá hủy tất cả các hoạt động của bạn VÀ đối tượng ứng dụng khi ứng dụng của bạn ở chế độ nền. –

3

Dưới đây là cách tôi chuyển dữ liệu của mình xung quanh ứng dụng thông qua lô hàng. Giả sử bạn có một lớp học có tên là Fisherman (cho người dùng cơ bản)

public class Fisherman implements Parcelable { 
private String name; 
private Tacklebox box; 
public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeString(name); 
    out.writeParcelable(box, 0); 
} 

public static final Parcelable.Creator<Fisherman> CREATOR 
     = new Parcelable.Creator<Fisherman>() { 
    public Fisherman createFromParcel(Parcel in) { 
     return new Fisherman(in); 
    } 

    public Fisherman[] newArray(int size) { 
     return new Fisherman[size]; 
    } 
}; 

private Fisherman(Parcel in) { 
    name = in.readString(); 
    box = in.readParcelable(com.fisher.Tacklebox); 
} 
} 

Trong ví dụ này, bạn xác định có thể chuyển nhượng cho từng mô hình dữ liệu bạn có. Vì vậy, nói rằng bạn có một đối tượng ngư dân, có chứa một đối tượng gọi là tacklebox. Bạn cũng sẽ xác định điều này cho tacklebox, và cứ thế tiếp tục nếu bạn tiếp tục làm tổ.Bằng cách này, tất cả các bạn cần phải làm gì để truyền dữ liệu giữa các hoạt động là

Intent intent = new Intent(this, Activity.class); 
intent.putParcelableExtra("com.fisher.Fisherman", fisherman); 

và đọc

Bundle b = getIntent().getExtras(); 
Fisherman fisher = b.getParcelable("com.fisher.Fisherman"); 

này unfortunetly câu trả lời duy nhất bước 3 của vấn đề của bạn, nhưng tôi khuyên bạn nên tách mỗi một trong 3 bước của bạn vào câu hỏi của riêng mình vì những gì bạn đang cố gắng làm hơi dài hơn một câu hỏi