2012-09-24 5 views
17

Tôi hiện đang cố gắng thử nghiệm dịch vụ của bên thứ ba cho ứng dụng của mình và cần phải xác định từng thử nghiệm đang được thực hiện ở mọi lần chạy cụ thể.là SharedPreferences truy cập thời gian tiêu thụ?

Vì nhiều thử nghiệm có thể diễn ra mỗi khi tôi chạy testApp, tôi cần phải Xác định mọi thử nghiệm.

Điều tôi nghĩ đến là lưu trữ tên thiết bị và xây dựng (không nhiều thiết bị ở đây) và chỉ mục cho mỗi thử nghiệm.

private String getTestId(){ 
    SharedPreferences settings = getPreferences(0); 
    SharedPreferences.Editor editor = settings.edit(); 
    int testNumber = settings.getInt("id", 0); 
    editor.putInt("id", testNumber+1); 
    editor.commit(); 
    String id = Build.DEVICE + Build.VERSION.RELEASE+" - test number: "+testNumber; 
    return id; 
} 

Có phải chạy chức năng này mỗi lần tôi chạy thử nghiệm hoặc tôi có thể làm điều này mà không sợ bờ biển?

nếu câu trả lời là "tốn thời gian", bạn sẽ đề xuất gì mỗi khi tôi chạy thử nghiệm để phân biệt mọi thử nghiệm?

+2

Xác định "tốn thời gian" - Truy cập vào 'SharedPreferences' = truy cập hệ thống tập tin mất nhiều thời gian hơn đơn giản trong hoạt động bộ nhớ. – zapl

+0

có cách nào tốt hơn để ký kiểm tra hay đây là cách tốt nhất để ký mà không ảnh hưởng đến thử nghiệm? – thepoosh

Trả lời

12

Giới thiệu SharedPreferences.

SharedPreferences cache sau lần tải đầu tiên, do đó truy cập đĩa để tải dữ liệu sẽ mất thời gian nhưng một lần. Bạn có thể thử tải SharedPreferences sớm trong bộ thử nghiệm của mình để tránh bị phạt này.

Để duy trì dữ liệu của bạn, bạn nên chọn SharedPreferences.Editor.apply() thay vì SharedPreferences.Editor.commit() vì không có đồng bộ. Nhưng vui lòng đọc tài liệu về cả hai để xem tài liệu nào áp dụng trong trường hợp của bạn.

1

Tôi đã nhận thấy rằng khi bạn sử dụng các phương pháp như putInt() lần đầu tiên cho một khóa cụ thể, có thể mất một khoảng thời gian đáng kể. Bên cạnh đó, nó phải là tương đương với bất kỳ cách nào khác để ghi vào một tập tin.

1

Câu hỏi đã có câu trả lời, nhưng trong trường hợp những người khác đến và đang tìm kiếm một mẫu mã, tôi đặt cùng lớp tiện ích này để tương tác với SharedPreferences.

Calling cam kết() sẽ sử dụng phương pháp áp dụng() nếu nó có sẵn, nếu không nó sẽ mặc định lại cam kết() trên các thiết bị cũ:

public class PreferencesUtil { 

    SharedPreferences prefs; 
    SharedPreferences.Editor prefsEditor; 
    private Context mAppContext; 
    private static PreferencesUtil sInstance; 

    private boolean mUseApply; 

    //Set to private 
    private PreferencesUtil(Context context) { 
     mAppContext = context.getApplicationContext(); 
     prefs = PreferenceManager.getDefaultSharedPreferences(mAppContext); 
     prefsEditor = prefs.edit(); 

     //Indicator whether or not the apply() method is available in the current API Version 
     mUseApply = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; 
    } 

    public static PreferencesUtil getInstance(Context context) { 
     if (sInstance == null) { 
      sInstance = new PreferencesUtil(context); 
     } 
     return sInstance; 
    } 

    public boolean getBoolean(String key, boolean defValue) { 
     return prefs.getBoolean(key, defValue); 
    } 

    public int getInt(String key, int defValue) { 
     return prefs.getInt(key, defValue); 
    } 

    public String getString(String key, String defValue) { 
     return prefs.getString(key, defValue); 
    } 

    public String getString(String key) { 
     return prefs.getString(key, ""); 
    } 

    public void putBoolean(String key, boolean value) { 
     prefsEditor.putBoolean(key, value); 
    } 

    public void putInt(String key, int value) { 
     prefsEditor.putInt(key, value); 
    } 

    public void putString(String key, String value) { 
     prefsEditor.putString(key, value); 
    } 

    /** 
    * Sincle API Level 9, apply() has been provided for asynchronous operations. 
    * If not available, fallback to the synchronous commit() 
    */ 
    public void commit() { 
     if (mUseApply) 
      //Since API Level 9, apply() is provided for asynchronous operations 
      prefsEditor.apply(); 
     else 
      //Fallback to syncrhonous if not available 
      prefsEditor.commit(); 
    } 
}