从SharedPreferences检索数据时抛出NullPointerException

时间:2014-06-13 09:09:58

标签: java android

首先,抱歉我的英语不好!

我有一个Activity(比如 MainActivity.java )和一个类(比如 AsynkTaskClass.java )。

AsynkTaskClass.java包含 AsynkTask 。我从 MainActivity.java 中调用此 AsynkTask

在调用 AsynkTask 之前,我使用 SharedPreferences 保存了一些数据。

AsynkTask onPostExecute 函数,我调用 MainActivity中定义的普通函数(比如 displaySharedData())的.java 。在那里,我试图使用 SharedPreferences 检索我存储的数据。然后它显示 NullPointerException 。但我可以从 displaySharedData()函数以外的任何地方访问共享数据。

这是日志输出:

W/dalvikvm(3896): threadid=1: thread exiting with uncaught exception
E/AndroidRuntime(3896): FATAL EXCEPTION: main
E/AndroidRuntime(3896): java.lang.NullPointerExceptionE/AndroidRuntime(3896):   at com.samApp.project.samApp.ui.MainActivity.displaySharedData(MainActivity.java:52)
E/AndroidRuntime(3896):     at com.samApp.project.samApp.s3.AsynkTaskClass$UploadImage.onPostExecute(AsynkTaskClass.java:264)
E/AndroidRuntime(3896):     at com.samApp.project.samApp.s3.AsynkTaskClass$UploadImage.onPostExecute(AsynkTaskClass.java:1)
E/AndroidRuntime(3896):     at android.os.AsyncTask.finish(AsyncTask.java:417)
E/AndroidRuntime(3896):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
E/AndroidRuntime(3896):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
E/AndroidRuntime(3896):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(3896):     at android.os.Looper.loop(Looper.java:130)
E/AndroidRuntime(3896):     at android.app.ActivityThread.main(ActivityThread.java:3683)
E/AndroidRuntime(3896):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(3896):     at java.lang.reflect.Method.invoke(Method.java:507)
E/AndroidRuntime(3896):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/AndroidRuntime(3896):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/AndroidRuntime(3896):     at dalvik.system.NativeStart.main(Native Method)

MainActivity.java

public class MainActivity extends Activity implements TextView.OnEditorActionListener {
    public SharedPreferences myData;
    public String mySharedData="com.samApp.project.samApp.ui";
    public SharedPreferences.Editor editor;

protected void onCreate(Bundle savedBundle) {
super.onCreate(savedBundle);
    myData = PreferenceManager.getDefaultSharedPreferences(this);
editor = myData.edit();
editor.commit();


attachfileButton.setOnClickListener(new View.OnClickListener() {
       @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(intent, PHOTO_SELECTED);

        }
    });

    }

    protected void onActivityResult(int requestCode, int resultCode,
            Intent imageReturnedIntent) {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

        switch (requestCode) {
        case PHOTO_SELECTED:
            if (resultCode == RESULT_OK) {

                Uri selectedImage = imageReturnedIntent.getData();
                Log.d("URIsssss", String.valueOf(selectedImage));
                AsynkTaskClass obj = new AsynkTaskClass ();
                AsynkTaskClass.s3context=this;
                obj.new UploadImage().execute(selectedImage);

            }
        }
    }
}
 protected void onResume() {
    super.onResume();
    editor.putString("name", "MeSSi");
    editor.commit();

    }


public void displaySharedData()
    {  

        Log.d("SharedData",myData.getString("name","")); // line No : 52
    }
}

AsynkTaskClass.java

public class AsynkTaskClass {

MainActivity mainActvtyObj = new MainActivity();
public static Context s3context;


protected void onPostExecute(S3TaskResult result) {
            if(dialog != null)
                dialog.dismiss();

            if (result.getErrorMessage() != null) {

                displayErrorAlert(
                        AsynkTaskClass.s3context.getString(R.string.upload_failure_title),
                    result.getErrorMessage());
            }

            mainActvtyObj.displaySharedData();

        }
 }

那么,任何帮助??

2 个答案:

答案 0 :(得分:2)

MainActivity mainActvtyObj = new MainActivity();

永远不要使用new实例化活动类。

例如,它们的生命周期回调(例如onCreate())不会运行。您在myData中初始化onCreate(),并在此活动实例中保持为空。

而是将对活动对象的引用作为参数传递给异步任务。

答案 1 :(得分:0)

最后我得到了一个有效的解决方案。

我不知道它是否完美!但它运作良好..

我将 displaySharedData()调用语句(即mainActvtyObj.displaySharedData();)替换为以下内容:

((MainActivity) s3context).displaySharedData();

现在它很棒!!