2010-11-18 29 views
27

Tôi có một số tùy chọn được chia sẻ (vĩ độ, kinh độ) mà tôi muốn truy cập từ dịch vụ không được phân loại từ Hoạt động.Các sự cố khi sử dụng SharedPreferences trên Dịch vụ (getPreferences không tồn tại trên dịch vụ)

Cụ thể, khi tôi cố gắng truy cập getPreferences, chức năng này không tồn tại trên một dịch vụ. Mã của tôi được đăng bên dưới

Mục tiêu của tôi ở đây là cho phép VIẾT những tùy chọn chia sẻ này với dịch vụ của tôi. Bất kỳ đề xuất/ví dụ có thể giúp tôi cùng?

public class MyService extends Service implements Runnable { 

    LocationManager mLocationManager; 
    Location mLocation; 
    MyLocationListener mLocationListener; 
    Location currentLocation = null; 
    static SharedPreferences settings; 
    static SharedPreferences.Editor configEditor; 

    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    public void onCreate() { 
     settings = this.getPreferences(MODE_WORLD_WRITEABLE); 
     configEditor = settings.edit(); 
     writeSignalGPS(); 
    } 

    private void setCurrentLocation(Location loc) { 
     currentLocation = loc; 
    } 

    private void writeSignalGPS() { 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
      Looper.prepare(); 
      mLocationListener = new MyLocationListener(); 
      mLocationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 1000, 0, mLocationListener); 
      Looper.loop(); 
      //Looper.myLooper().quit(); 
     } else { 
      Toast.makeText(getBaseContext(), 
       getResources().getString(R.string.gps_signal_not_found), 
       Toast.LENGTH_LONG).show(); 
     } 
    } 

    private Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      if (currentLocation!=null) { 
       configEditor.putString("mylatitude", ""+currentLocation.getLatitude()); 
       configEditor.putString("mylongitude", ""+currentLocation.getLongitude()); 
       configEditor.commit(); 
      } 
     } 
    }; 

    private class MyLocationListener implements LocationListener { 
     @Override 
     public void onLocationChanged(Location loc) { 
      if (loc != null) { 
       Toast.makeText(getBaseContext(), 
       getResources().getString(R.string.gps_signal_found), 
        Toast.LENGTH_LONG).show(); 
       setCurrentLocation(loc); 
       handler.sendEmptyMessage(0); 
      } 
     } 

    @Override 
    public void onProviderDisabled(String provider) {} 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
} 

tôi nhận được lỗi trên dòng settings = this.getPreferences(MODE_WORLD_WRITEABLE);

Trả lời

43

Nếu bạn chỉ sử dụng một SharedPreferences cho ứng dụng của bạn, có tất cả mã của bạn nhận được nó qua PreferenceManager.getDefaultSharedPreferences().

+0

bạn có thể giải thích cho tôi thêm một chút về những gì tôi phải thay đổi trên codde của mình để sử dụng trình quản lý tùy chọn không? tôi đang tìm kiếm trên google nhưng tôi không thể tìm thấy thông tin hợp lệ cho tôi – NullPointerException

+1

@ AndroidUser99: Bạn thay thế các cuộc gọi đến 'getPreferences()' bằng một cuộc gọi đến 'PreferenceManager.getDefaultSharedPreferences()'. – CommonsWare

+0

tôi đã thử với điều này: settings = PreferenceManager.getDefaultSharedPreferences (MODE_WORLD_WRITEABLE); nhưng cho tôi lỗi, những gì tôi đang làm sai? – NullPointerException

1

Nếu bạn đã tuyên bố SharedPreferences như:

private static final String PREFS_NAME = "UserData"; 
private static final String PREFS_VALUE1 = "value1"; 

sau đó sử dụng mã dưới đây để lấy giá trị:

SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
value1 = preferences.getString(PREFS_VALUE1, "0"); 

Trong cùng một cách mà bạn thậm chí có thể lưu các giá trị để SharedPreferences.

2

Ít trễ để giúp bạn thực hiện việc này, nhưng tôi hy vọng điều này sẽ giúp ai đó trong tương lai. Đây là vấn đề của bạn:

public void onCreate() { 
     settings = this.getPreferences(MODE_WORLD_WRITEABLE); 
     configEditor = settings.edit(); 
     writeSignalGPS(); 
    } 

Vì bạn chỉ lấy file Preference chung khi dịch vụ được tạo ra, các tập tin không bao giờ được cập nhật đúng bởi dịch vụ và do đó các dữ liệu không bao giờ được chia sẻ với các ứng dụng. Trước khi viết để Preferences chung hoặc lấy bất kỳ dữ liệu nào có thể thay đổi, hãy chắc chắn để lấy file Preference chung (tải lại) một lần nữa như:

private Handler handler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if (currentLocation!=null) { 
      settings = this.getPreferences(MODE_WORLD_WRITEABLE); 
      configEditor = settings.edit(); 
      configEditor.putString("mylatitude", ""+currentLocation.getLatitude()); 
      configEditor.putString("mylongitude", ""+currentLocation.getLongitude()); 
      configEditor.commit(); 
     } 
    } 

sau đó trong ứng dụng của bạn:

 settings = this.getPreferences(MODE_WORLD_WRITEABLE); 
    String myLat = setttings.getString("mylatitude",""); 

Ngoài ra, bất cứ điều gì trên Android 3.0 có một kịch bản mà một dịch vụ và một hoạt động chia sẻ Prefs được chia sẻ, bạn nên sử dụng:

 settings = this.getPreferences(MODE_MULTI_PROCESS); 
19

Thực ra, hầu hết các bạn có thể đang chạy vào p roblem, mà trên các thiết bị với API> = 11, các sở thích được chia sẻ không được thiết lập cho quá trình sử dụng đa theo mặc định nữa.

Giải pháp:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS); 
} else { 
    prefs = getSharedPreferences(PREFS, 0); 
} 
+1

Theo nhận xét trên @CommonsWare câu trả lời, làm thế nào bạn có thể làm điều này với '' PreferenceManager.getDefaultSharedPreferences() ''? Tôi đang ở trong một dịch vụ và tôi không biết tên của các tùy chọn chia sẻ mặc định của mình. – gozzilli

+0

Thực sự bạn đã cứu tôi. Thanx a lottttttttttttttttttt –

+0

'MODE_MULTI_PROCESS' đã không được chấp nhận trong API 23. Xem http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS –

1

Đối với những người đụng vào này ... Tôi đã có một vấn đề tương tự ... Nguyên nhân thực sự của vấn đề là chúng ta đang cố gắng để có được/sử dụng một bối cảnh đó không phải là hoàn toàn khởi tạo .. Tôi đã có thể sử dụng sharedPreferences bình thường bên ngoài constructor của tôi cho IntentService của tôi.

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