2013-02-01 47 views
0

我想從我的SharedPreference中加載字符串對象,但我得到一個NullPointerException ..我對此很新,所以我可能沒有正確使用它。加載SharedPreference給NullPointerException

誤差在

loadPreferences

SharedPreferences sharedPreferences =的getPreferences(MODE_PRIVATE);

這裏是我的代碼,

public class OfflineActivity extends Activity implements NetworkObserver { 

    public GeoPoint ourLocationGeoPoint; 
    public List<PointOfInterest> pointList = new ArrayList<PointOfInterest>(); 
    SharedPreferences pointsToAddToServer; 
    int index; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.offline_mode_layout); 

     //Load preferences 
     loadPreferences(); 

     // Register for network status updates 
     if (!NetworkStatus.isConnectedToInternet(getApplicationContext())) { 
      NetworkStatus networkStatus = new NetworkStatus(this); 
      networkStatus.addObserver(new OfflineActivity()); 
      Thread thread = new Thread(networkStatus); 
      thread.start(); 
     } 

     // Acquire a reference to the system Location Manager 
     LocationManager locationManager = (LocationManager) this 
       .getSystemService(Context.LOCATION_SERVICE); 

     // Define a listener that responds to location updates 
     LocationListener locationListener = new LocationListener() { 

      public void onLocationChanged(Location location) { 
       // Called when a new location is found by the network location 
       // provider. 
       /** 
       * Save Location to geopoint 
       */ 
       int lat = (int) (location.getLatitude() * 1E6); 
       int lng = (int) (location.getLongitude() * 1E6); 
       ourLocationGeoPoint = new GeoPoint(lat, lng); 
      } 

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

      public void onProviderEnabled(String provider) { 
      } 

      public void onProviderDisabled(String provider) { 
      } 
     }; 
     for (String provider : locationManager.getAllProviders()) { 
      // Register the listener with the Location Manager to receive 
      // location updates 
      locationManager.requestLocationUpdates(provider, 0, 0, 
        locationListener); 
     } 
    } 

    /** 
    * Add new location to database 
    * 
    * @param view 
    */ 
    public void addCurrentLocation(View view) { 

     if (ourLocationGeoPoint != null) { 

      LayoutInflater inflater = LayoutInflater.from(this); 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      view = inflater.inflate(R.layout.new_location_dialog, null); 
      builder.setView(view); 

      // Set fields 
      final EditText titleBox = (EditText) view.findViewById(R.id.title); 
      final EditText descriptionBox = (EditText) view 
        .findViewById(R.id.description); 
      final RatingBar ratingBar = (RatingBar) view 
        .findViewById(R.id.ratingBar); 
      final Spinner categoryDropdownMenu = (Spinner) view 
        .findViewById(R.id.categoryDropDown); 

      // When User clicks Save 
      builder.setPositiveButton("Save", 
        new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int button) { 

          String title = titleBox.getText().toString(); 
          String description = descriptionBox.getText() 
            .toString(); 
          String category = ("" + categoryDropdownMenu 
            .getSelectedItem()) 
            .toLowerCase(Locale.ENGLISH); 

          int ratingNum = (int) ratingBar.getRating(); 
          Log.d("User Setting title/description to: ", 
            title + " : " + description); 

          // Create new Private Data field containing title/
          // rating 
          PrivateField privateField = new PrivateField(
            "Michael", title, ratingNum); 

          // Create new point of Interest 
          PointOfInterest point = new PointOfInterest(
            category, description, ourLocationGeoPoint, 
            privateField); 

          // Add to list to update later 
          Gson gson = new Gson(); 
          String pointOfInterest = gson.toJson(point); 

          savePreferences(String.valueOf(index), pointOfInterest); 
          // Increase our index 
          index++; 

          Log.d("OfflineActivity", "Saving point " 
            + point.latitude + ":" + point.longitude); 
          Toast.makeText(
            getBaseContext(), 
            "Will add point \"" 
              + point.getTitle() 
              + "\" when network connection has been made.", 
            Toast.LENGTH_SHORT).show(); 
         } 
        }); 

      // When User clicks cancel 
      builder.setNegativeButton("Cancel", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          Log.d("Cancel setting Title & adding point", ""); 
          return; 
         } 
        }); 

      builder.show(); 
     } else { 
      Toast.makeText(this, "Could not determine location :(", 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void updateStatus() { 

     loadPreferences(); 
     SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 

     for (PointOfInterest poi : pointList) { 
      UploadPointOfInterest uploadPointOfInterest = new UploadPointOfInterest(poi); 
      uploadPointOfInterest.execute(); 
     } 
     // Clear preferences, reset index 
     editor.clear(); 
     editor.commit(); 
     index = 0; 
    } 

    /** 
    * Save preferences 
    * @param key 
    * @param value 
    */ 
    private void savePreferences(String key, String value) { 
     SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, value); 
     editor.commit(); 
    } 

    /** 
    * Load saved Preferences 
    */ 
    private void loadPreferences() { 
     SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); <-- NullPointer here 
     PointOfInterest temp; 
     PointOfInterest point; 
     Gson gson = new Gson(); 

     /** 
     * Load all points from shared prefs 
     */ 
     for(int x =0; ;x++) { 
      index = x; 
      if(sharedPreferences.contains(String.valueOf(x))){ 
       temp = gson.fromJson(sharedPreferences.getString(String.valueOf(x), null), PointOfInterest.class); 
       point = new PointOfInterest(temp.getType(),temp.getDescription(),temp.getGeoPoint(),temp.getPrivateField()); 
       Log.d("Offline activity", "Loading point from sharedpref: " + point.getTitle()); 
       pointList.add(point); 
      } 
      else { 
       break; 
      } 
     } 

    } 
} 

和堆棧跟蹤,

02-01 03:32:53.046: E/AndroidRuntime(30325): Uncaught handler: thread Thread-14 exiting due to uncaught exception 
02-01 03:32:53.046: E/AndroidRuntime(30325): java.lang.NullPointerException 
02-01 03:32:53.046: E/AndroidRuntime(30325): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:120) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at android.app.Activity.getLocalClassName(Activity.java:3413) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at android.app.Activity.getPreferences(Activity.java:3447) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at com.example.mapproject.OfflineActivity.loadPreferences(OfflineActivity.java:207) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at com.example.mapproject.OfflineActivity.updateStatus(OfflineActivity.java:177) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at com.example.mapproject.NetworkStatus.notifyObservers(NetworkStatus.java:58) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at com.example.mapproject.NetworkStatus.run(NetworkStatus.java:68) 
02-01 03:32:53.046: E/AndroidRuntime(30325): at java.lang.Thread.run(Thread.java:1096) 
02-01 03:32:53.226: E/SemcCheckin(30325): Get crash dump level : java.io.FileNotFoundException: /data/semc-checkin/crashdump 
+0

你是如何開展活動? –

+0

'新的OfflineActivity()'不要通過顯式構造函數實例化活動。與你的NPE有關/不相關,這仍然是一個問題。 –

+0

我從意向表單開始另一個活動。 – TomSelleck

回答

4

既然大家ISN讀到評論後,OP的問題與偏好無關這與它們實例化另一個活動有關。 Android 不會很好地工作,因爲通過構造函數顯式實例化的活動不完整。所有運算所要做的就是改變

networkStatus.addObserver(new OfflineActivity()); 

networkStatus.addObserver(this); 

這樣的Android不創建活動的一個新的(壞)的實例。

當你看到這樣的:

顯示java.lang.NullPointerException三月二日至1日:32:53.046: E/AndroidRuntime(30325):在

android.content.ContextWrapper。 getPackageName(ContextWrapper.java:120)

它通常有做幕後的操作(怎麼可能getPackageName()爲空就這樣?)CAU由一個明確的instantiaion sed。

0
public void savePreference(String stringToSave){ 
    Editor custom_editor = custom_editor.edit(); 
    custom_editor.putString(NameToSaveAs, stringToSave); 
    custom_editor.commit(); 
} 

public String getPreferences(){ 
    return yourPreferenceName.getString(NameToSaveAs, null); 
} 

您可以與其他待辦事項的東西修改這個..

0

的問題就在這裏,

// Register for network status updates 
    if (!NetworkStatus.isConnectedToInternet(getApplicationContext())) { 
     NetworkStatus networkStatus = new NetworkStatus(this); 
     networkStatus.addObserver(new OfflineActivity()); <---- 
     Thread thread = new Thread(networkStatus); 
     thread.start(); 
    } 

本來應該是:

// Register for network status updates 
    if (!NetworkStatus.isConnectedToInternet(getApplicationContext())) { 
     NetworkStatus networkStatus = new NetworkStatus(this); 
     networkStatus.addObserver(this); <---- 
     Thread thread = new Thread(networkStatus); 
     thread.start(); 
    } 
相關問題