首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何以编程方式清除android中的用户数据?

如何以编程方式清除android中的用户数据?
EN

Stack Overflow用户
提问于 2015-10-10 11:08:29
回答 3查看 1.4K关注 0票数 2

你好,我是android的新手,我遵循了一个教程,它解释了如何清除android中的应用程序数据,但是当我试图清除我的数据时,我得到了一个空对象引用错误。

Main.java

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
  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

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-10 11:33:31

NPE表示您的ClearDataApplication.getInstance()正在返回null。

ClearDataApplication扩展了应用程序,这意味着它将作为应用程序在运行过程的生命周期中的表示。您不需要getInstance()方法,因为运行时已经保证只有一个实例。相反,从您的活动中调用getApplication()并将其转换为ClearDataApplicatiom。

为了使上面的内容起作用,您还需要对清单文件进行更改,以指定ClearDataApplication是应用程序的表示形式。

代码语言:javascript
运行
复制
<application android:name=".ClearDataApplication" ...>

参考资料:http://developer.android.com/guide/topics/manifest/application-element.html#nm

票数 0
EN

Stack Overflow用户

发布于 2015-10-10 11:28:57

您是否在应用程序标签下添加了android:name="**/ClearDataApplication"

代码语言:javascript
运行
复制
<Application
    android:name="path of ClearDataApplication"
    ...
</Application>
票数 0
EN

Stack Overflow用户

发布于 2015-10-10 11:33:37

你在你的安卓清单文件中设置了应用程序的ClearDataApplication吗?可以不调用onCreate类中的ClearDataApplication方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33053295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档