2012-02-17 28 views
5

Tôi vừa phát hành hình nền động đầu tiên cho Android. Tôi đã thử nghiệm nó trên điện thoại và một số điện thoại bạn bè mà không tìm thấy bất kỳ vấn đề nào, nhưng rõ ràng trên một số thiết bị bị kẹt trong một vòng lặp đệ quy và gây ra lỗi tràn ngăn xếp khi người dùng cố thay đổi cài đặt.onSharedPreferenceThay đổi đang gây ra tràn ngăn xếp trên một số thiết bị Android

Tôi tin rằng sự cố xảy ra vì tôi có một số cài đặt "chủ đề" nhất định cần phải thay đổi một số giá trị được duy trì khác. Ví dụ: một chủ đề sẽ đặt màu mặc định, tốc độ, nền, v.v ... Có vẻ như khi tôi duy trì các giá trị này theo lập trình với Editor.commit(), nó gọi lại trênSharedPreferenceChanged một lần nữa, và một lần nữa ...

Vì đây là hình nền động, tôi có bản xem trước chạy phía sau màn hình tùy chọn trong suốt và tôi cần nó để phản ánh các thay đổi cài đặt khi chúng được tạo. Tôi cũng cần các thanh trượt/bộ chọn màu/tùy chọn danh sách để phản ánh các thay đổi do người dùng thực hiện trực tiếp và lập trình khi một "chủ đề" được chọn. Cách dễ nhất để làm điều này dường như là thay đổi chúng bằng một trình soạn thảo tùy chọn trong onSharedPreferenceChanged, và thực sự, nó hoạt động trên nhiều thiết bị.

Tôi có thể làm gì để làm cho thiết bị hoạt động trên tất cả các thiết bị?

Dưới đây là các mã có liên quan:

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) 
{ 


    if(key != null) 
    { 

    SharedPreferences.Editor editor = prefs.edit(); 

    hue = prefs.getInt("color", 0); 
    BG_COLOR = prefs.getInt("background_color", 0); 

//etc... 



    if(key.matches("plasma_set")) 
    { 

     plasmaAtlasName = atlasName; 
     editor.putString("atlasName", atlasName); 

     //load each bolt set with defalut values 

     if(plasmaAtlasName.equals("plasmaAtlas11")) 
     { 
      hue = 180; 
      editor.putInt("speed", 10); 
      editor.putInt("bolt_density", 2); 
      BG_COLOR = 0; 
      editor.putInt("background_color", BG_COLOR); 
      editor.putInt("color", hue); 
     } 

     if(plasmaAtlasName.equals("plasmaAtlas9")) 
     { 
      hue = 330; 
      editor.putInt("speed", 10); 
      editor.putInt("bolt_density", 2); 
      BG_COLOR = 0; 
      editor.putInt("background_color", BG_COLOR); 
      editor.putInt("color", hue); 

     } 

    //etc... 
} 

editor.commit(); 
} 
} 

Trả lời

3

Ok, tôi figured it out. Đó là một vấn đề đơn giản của việc hủy đăng ký người nghe trước khi gọi Editor.commit() và sau đó đăng ký lại sau đó.

+0

Bạn có thể đưa ra một số ví dụ không? – nAkhmedov

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