2015-10-10 2 views
2

Привет, я новичок в android, я следил за tutorial, которые объясняют, как очистить данные приложения в Android, но когда я пытаюсь очистить свои данные, я получаю ошибку ссылки на нулевой объект.Как очистить данные пользователя в программном обеспечении Android?

Main.java

public class MainActivity extends ActionBarActivity { 
     Button b; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      b = (Button)findViewById(R.id.start); 
      addDataInAppDir(); 

      b.setOnClickListener(new OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        ClearDataApplication.getInstance().clearApplicationData(getBaseContext()); 
       } 


      }); 
     } 

     private void addDataInAppDir() { 
      SharedPreferences settings = getSharedPreferences("sample", 0); 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.putBoolean("key1", true); 
      editor.putString("key2", "Some strings in prefs"); 
      editor.commit(); 

      try { 

       final String FILECONTENT = "This is string in file samplefile.txt"; 
       FileOutputStream fout = openFileOutput("samplefile.txt", MODE_PRIVATE); 
       OutputStreamWriter osw = new OutputStreamWriter(fout); 
       osw.write(FILECONTENT); 
       osw.flush(); 
       osw.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 


    } 

ClearDataApplication.java

public class ClearDataApplication extends Application 
    { 
     private static ClearDataApplication instance; 

      @Override 
      public void onCreate() { 
       super.onCreate(); 
       instance = this; 
      } 

      public static ClearDataApplication getInstance() { 
       return instance; 
      } 

      public void clearApplicationData(Context mContext) { 

       File cache = mContext.getCacheDir(); 
       File appDir = new File(cache.getParent()); 

       if(appDir.exists()) { 
        String[] children = appDir.list(); 

        for(String s : children) { 
         if(!s.equals("lib")) { 
          deleteDir(new File(appDir, s)); 
         } 
        } 
       } 
      } 


      public static boolean deleteDir(File dir) { 
       if (dir != null && dir.isDirectory()) { 
        String[] children = dir.list(); 
        for (int i = 0; i < children.length; i++) { 
         boolean success = deleteDir(new File(dir, children[i])); 
         if (!success) { 
          return false; 
         } 
        } 
       } 

       return dir.delete(); 
      } 
    } 

Logcat

10-10 16:25:55.589: E/AndroidRuntime(6121): FATAL EXCEPTION: main 
10-10 16:25:55.589: E/AndroidRuntime(6121): Process: com.example.fetchdata, PID: 6121 
10-10 16:25:55.589: E/AndroidRuntime(6121): java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.fetchdata.ClearDataApplication.clearApplicationData(android.content.Context)' on a null object reference 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at com.example.fetchdata.MainActivity$1.onClick(MainActivity.java:29) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at android.view.View.performClick(View.java:4756) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at android.view.View$PerformClick.run(View.java:19749) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at android.os.Handler.handleCallback(Handler.java:739) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at android.os.Handler.dispatchMessage(Handler.java:95) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at android.os.Looper.loop(Looper.java:135) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at android.app.ActivityThread.main(ActivityThread.java:5221) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at java.lang.reflect.Method.invoke(Native Method) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at java.lang.reflect.Method.invoke(Method.java:372) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
10-10 16:25:55.589: E/AndroidRuntime(6121):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

вместо получения базового контекста используйте ключевое слово «this» – nomad

ответ

0

NPE заявляет, что ваш ClearDataApplication.getInstance() возвращает null.

ClearDataApplication расширяет приложение, так что означает, что оно предназначено для вашего представления приложения на протяжении всего жизненного цикла процесса. Вам не нужен этот метод getInstance(), поскольку время выполнения уже гарантирует, что будет только один экземпляр. Вместо этого от вашей деятельности вызовите getApplication() и отбросьте его на ClearDataApplicatiom.

Для того чтобы вышеуказанное работало, вам также необходимо внести изменения в файл манифеста, чтобы указать, что ClearDataApplication - это то, что должно использоваться в качестве представления приложения.

<application android:name=".ClearDataApplication" ...> 

Ссылка: http://developer.android.com/guide/topics/manifest/application-element.html#nm

0

Вы добавили android:name="**/ClearDataApplication" под тег приложения в Manifest.xml? Как

<Application 
    android:name="path of ClearDataApplication" 
    ... 
</Application> 
+0

Да, я объявил его в Manifest.xml –

+0

Предлагаю вам добавить журнал отладки в ClearDataApplication # onCreate, чтобы узнать, был ли вызван метод. – starkshang

0

Вы установите ClearDataApplication приложение для приложения в андроид манифестов файл. Возможно, метод onCreate в классе ClearDataApplication не вызывается.

Смежные вопросы