2012-08-10 97 views
1

这是我SharedPreference类:空指针异常的Android

public class MySharedPrefs { 
private static final String APP_SHARED_PREFS = "com.astroved.Horawatch"; 
private SharedPreferences appSharedPrefs; 
private Editor prefsEditor; 

public MySharedPrefs(Context context) 
{ 
    this.appSharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
    this.prefsEditor = appSharedPrefs.edit(); 
} 

public String getPrefsValue(String value) { 
    return appSharedPrefs.getString(value, ""); 
} 

public void savePrefsValue(String key , String Value) { 
    prefsEditor.putString(key, Value); 
    prefsEditor.commit(); 
} 

public Boolean checkKey(String Key) 
{ 
    if(appSharedPrefs.contains(Key)) 
     return true;  
    else 
     return false; 
} 

}

MyFunctionClass:

public class Functions_class extends Activity{ 


AstroVedTime tz,lat,lon; 
TimeZone tz1; 
protected MySharedPrefs appPrefs; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);{ 
     appPrefs = new MySharedPrefs(Functions_class.this); 
    } 
    } 

public void user_informations(int myear,int mMonth, int mDay){ 

    int year = myear,month = mMonth+1,day = mDay; 
    Moment mn = new Moment(year,month,day,user_device_time()); 
    //appPrefs = new MySharedPrefs(Functions_class.this); 

    if(appPrefs.checkKey("City_name1")){ 
     TimeZone.setDefault(TimeZone.getTimeZone(appPrefs.getPrefsValue("selected_time_zone"))); 
     Log.v("LOG_TAG"+"here the error is : ", appPrefs.getPrefsValue("selected_lat")+""); 
     Log.v("LOG_TAG", appPrefs.getPrefsValue("selected_longi")+""); 
     tz1 = TimeZone.getDefault(); 
     lat = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_lat")));// Latitude 
     lon = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_longi")));// Longitude 
    } 

这是我logcat

08-10 14:07:14.947: E/AndroidRuntime(475): FATAL EXCEPTION: Thread-13 
08-10 14:07:14.947: E/AndroidRuntime(475): java.lang.NullPointerException 
08-10 14:07:14.947: E/AndroidRuntime(475): at com.astroved.horawatch.Functions_class.user_informations(Functions_class.java:46) 
08-10 14:07:14.947: E/AndroidRuntime(475): at com.astroved.horawatch.HoraWatchActivity$13$1.run(HoraWatchActivity.java:1106) 
08-10 14:07:16.628: E/WindowManager(475): Activity com.astroved.horawatch.HoraWatchActivity has leaked window [email protected] that was originally added here 
08-10 14:07:16.628: E/WindowManager(475): android.view.WindowLeaked: Activity com.astroved.horawatch.HoraWatchActivity has leaked window [email protected] that was originally added here 
08-10 14:07:16.628: E/WindowManager(475): at android.view.ViewRoot.<init>(ViewRoot.java:258) 
08-10 14:07:16.628: E/WindowManager(475): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
08-10 14:07:16.628: E/WindowManager(475): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
08-10 14:07:16.628: E/WindowManager(475): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
08-10 14:07:16.628: E/WindowManager(475): at android.app.Dialog.show(Dialog.java:241) 
08-10 14:07:16.628: E/WindowManager(475): at com.astroved.horawatch.HoraWatchActivity$13.onClick(HoraWatchActivity.java:1103) 
08-10 14:07:16.628: E/WindowManager(475): at android.view.View.performClick(View.java:2485) 
08-10 14:07:16.628: E/WindowManager(475): at android.view.View$PerformClick.run(View.java:9080) 
08-10 14:07:16.628: E/WindowManager(475): at android.os.Handler.handleCallback(Handler.java:587) 
08-10 14:07:16.628: E/WindowManager(475): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-10 14:07:16.628: E/WindowManager(475): at android.os.Looper.loop(Looper.java:123) 
08-10 14:07:16.628: E/WindowManager(475): at android.app.ActivityThread.main(ActivityThread.java:3683) 
08-10 14:07:16.628: E/WindowManager(475): at java.lang.reflect.Method.invokeNative(Native Method) 
08-10 14:07:16.628: E/WindowManager(475): at java.lang.reflect.Method.invoke(Method.java:507) 
08-10 14:07:16.628: E/WindowManager(475): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
08-10 14:07:16.628: E/WindowManager(475): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
08-10 14:07:16.628: E/WindowManager(475): at dalvik.system.NativeStart.main(Native Method) 

我通用电器解决上述错误。我在调用SharedPreference值时出错。我无法弄清楚。以前我得到这个错误

at android.content.contextwrapper.getsharedpreferences contextwrapper.java 146 

我通过调用OnCreateSharedPreferences清除上述错误。如何清除上面显示的Logcat错误。我错了吗?

我打电话下面

HoraWatchActivity所示的另一个我的activity.Its的onclick过程中MyFunctionClass方法:

public Functions_class func_cls = new Functions_class(); 
private OnClickListener show_panchang_page = new OnClickListener(){ 

    public void onClick(View v) { 

     pbarDialog = new ProgressDialog(HoraWatchActivity.this); 
     pbarDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     pbarDialog.setMessage("Loading Panchang..."); 
     pbarDialog.show(); 
       Thread t = new Thread(){ 
        public void run(){ 
         func_cls.user_informations(mYear, mMonth, mDay); 
         Message myMessage=new Message(); 
         Bundle resBundle = new Bundle(); 
         resBundle.putString("status", "SUCCESS"); 
         myMessage.obj=resBundle; 
         handler.sendMessage(myMessage); 
        } 
       }; 
       t.start(); 
    } 
}; 

更快响应将帮助我Lot.Thanks。

+1

里面我认为错误是HoraWatchActivity。 java。不是他在这里发布的一个。 – 2012-08-10 09:11:37

+0

@AndroSelva:我在HoraWatchActivity中调用了MyFunctionClass中的方法。该错误显示在if(appPrefs.checkKey(“City_name1”))....所以我认为错误正在重试SharedPreference值。我对吗? – Dray 2012-08-10 09:17:03

+0

你可否请张贴那部分?对事物进行分类会有所帮助。 – 2012-08-10 09:19:47

回答

2

好的发现了问题。问题出在Function classuser_informations这个变量中,appPrefs。它在那一点上是空的。

你在做什么时,你在的onCreate()发起的appPrefs,但是当你做这样的事情,你public Functions_class func_cls = new Functions_class();的onCreate不叫,这意味着它直接进入方法并返回null给你。您必须对现有代码进行一些修改。

试试这个,

1)首先通过你当前活动上下文的方法,

2)取消注释此行的方法appPrefs = new MySharedPrefs(context);

public void user_informations(int myear,int mMonth, int mDay,Context context){ 

    int year = myear,month = mMonth+1,day = mDay; 
    Moment mn = new Moment(year,month,day,user_device_time()); 
    appPrefs = new MySharedPrefs(context); 

    if(appPrefs.checkKey("City_name1")){ 
     TimeZone.setDefault(TimeZone.getTimeZone(appPrefs.getPrefsValue("selected_time_zone"))); 
     Log.v("LOG_TAG"+"here the error is : ", appPrefs.getPrefsValue("selected_lat")+""); 
     Log.v("LOG_TAG", appPrefs.getPrefsValue("selected_longi")+""); 
     tz1 = TimeZone.getDefault(); 
     lat = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_lat")));// Latitude 
     lon = new AstroVedTime(Double.parseDouble(appPrefs.getPrefsValue("selected_longi")));// Longitude 
    } 
+0

HMmm。再次ThankYou ..所以我没有通过上下文。我知道了 :) – Dray 2012-08-10 09:48:38

1

您正在手动实例化活动类Functions_class。如果您开始该活动,该框架将处理此问题。即使Functions_class没有被用作一个活动,那么你将不得不手动调用Function_class的createcreate。这就是appPrefs正在初始化的地方。 user_informations函数中的appPrefs为null。初始化它。

+0

我已初始化appPrefs在user_information.During时间只有我得到了 在android.content.contextwrapper.getsharedpreferences contextwrapper.java 146 错误。所以我在OnCreate中初始化。我直接从另一个函数调用user_informations函数。这不会初始化Func_class的Oncreate中的appPrefs。如何发起这个? – Dray 2012-08-10 09:38:25

+0

你是否正确。我明白了。 thnks :) – Dray 2012-08-10 09:49:18

1

我认为你的方法是错误的,因为你正在调用一个Activity的方法(iefunc_cls.user_informations(mYear,mMonth,mDay);),它没有从可见的Activity(HoraWatchActivity.this)中获得焦点。函数除了从共享首选项中获取价值外无所作为。数据检索应该在NonActivity类中完成.appPrefs不是初始化的。

+0

Thnks ...我得到它 – Dray 2012-08-10 09:48:59