由于Android中的上下文,尝试从共享首选项中获取值时获取NullPointerException

时间:2014-07-09 10:54:13

标签: java android android-asynctask sharedpreferences android-context

我已经创建了一个单独的asynctask,我将一些值存储到android中的共享首选项中,但我在所有其他活动中获取这些值。当我试图在asynctask中获取此共享首选项值时,它会给我一个nullpointer异常,我认为这是因为上下文,但我不知道如何解决它。

的AsyncTask

public class Updatelocation extends AsyncTask<String, String, Void> {
    private Context mContext;

    public Updatelocation(Context context) {
        mContext = context;
    }

    String reg_no = Pref.getValue(mContext, Const.PREF_REG, "");
    String udid = Pref.getValue(mContext, Const.PREF_REG, "");

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog

    }

    @Override
    protected Void doInBackground(String... arg0) {
        System.out
                .println(":::::::::::::::::::::::::::::Registration and udid:::::::::::::::::::::::"
                        + reg_no + "=========" + udid);
        String updateURL = Const.API_UPDATE_LOCATION + "?UDID=" + udid
                + "&latitude=" + arg0[0] + "&longitude=" + arg0[1]
                + "&registration_no=" + reg_no;

        updateURL = updateURL.replace(" ", "%");

        BackendAPIService sh = new BackendAPIService();
        System.out.println(":::::::::::::UPDATE URL:::::::::::;" + updateURL);
        String jsonStr = sh.makeServiceCall(updateURL, BackendAPIService.POST);

        Log.d("Response: ", "> " + jsonStr);
        System.out.println("=============MY RESPONSE==========" + jsonStr);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog

    }
}

2 个答案:

答案 0 :(得分:0)

尝试在doInBackgroud参数中传递您的活动并尝试以下代码:

Activity activity = (Activity) params[0];
Long newLong = Long.valueOf(0000);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
Long lastDate = prefs.getLong(DATETIMEKEY, newLong);

对我而言,它运作正常。

我认为问题是在构造函数中传递上下文。

答案 1 :(得分:0)

您的NullPointerException来自以下几行:

String reg_no = Pref.getValue(mContext, Const.PREF_REG, "");
String udid = Pref.getValue(mContext, Const.PREF_REG, "");

这两个字符串被定义为UpdateLocation类的属性。这意味着它们在构造函数被调用之前被实例化,并且 - 此时 - 您的mContext值为null。这就是当您尝试从首选项中获取值时获得NPE的原因。

要解决此问题,您必须将这些行放入构造函数中:

private Context mContext;
String reg_no;
String udid;

public Updatelocation(Context context) {
    mContext = context;
    reg_no = Pref.getValue(mContext, Const.PREF_REG, "");
    udid = Pref.getValue(mContext, Const.PREF_REG, "");
}