SharedPreferences在AsyncTask中给出空指针

时间:2013-10-04 06:44:01

标签: android android-asynctask sharedpreferences

这是我的班级:

public class LoginTask extends AsyncTask<Void, Void, Void> 
{
    Context c;
    MainActivity main;
    String profileid;

@Override
protected void onPreExecute() { 

}  


@Override
protected Void doInBackground(Void... unused) { 

    try {


        String semail = MainActivity.email.getText().toString();
        String spassword = MainActivity.password.getText().toString();

        String savedresponse;

        String postURL = "http://(My URL)";

        HttpPost post = new HttpPost(postURL); 

        HttpParams httpParameters = new BasicHttpParams();

        int timeoutConnection = 5000;
        HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);

        int timeoutSocket = 5000;
        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

        DefaultHttpClient client = new DefaultHttpClient(httpParameters);

        post.setHeader("Content-type","application/json");


        JSONObject jsonobj = new JSONObject();
        jsonobj.put("username", semail);
        jsonobj.put("password", spassword);

        StringEntity se = new StringEntity(jsonobj.toString());

        post.setEntity(se);
        HttpResponse responsePOST = client.execute(post);

        HttpEntity resEntity = responsePOST.getEntity();  

        savedresponse = EntityUtils.toString(resEntity);

        if (resEntity != null)
        {    
            Log.i("RESPONSE",savedresponse);

            JSONObject json = new JSONObject(savedresponse);

            int responseCode;

            responseCode = json.getInt("ResponseCode");



            profileid = json.getString("ProfileID");

            SharedPreferences prefs = main.getSharedPreferences("ProfileName", Context.MODE_PRIVATE);
            Editor editor = prefs.edit();
            editor.clear();
            editor.putString("ProfileCookie", profileid);
            editor.commit();


                if(responseCode == 100) {

                    MainActivity.email.setText("");
                    MainActivity.password.setText("");

                    main.Login();

            }
                else
                {
                    Toast.makeText(c, "Username or Password wrong", Toast.LENGTH_SHORT).show();
                }



        } 
        if (resEntity == null)
        {
            Log.i("NO RESPONSE",EntityUtils.toString(resEntity));
            Toast.makeText(c, "NO RESPONSE", Toast.LENGTH_SHORT).show();
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    } 


    return null; 
} 


@Override
protected void onPostExecute(Void result)  
{ 

 } 

}

这是我在错误日志中得到的:

10-04 02:30:07.283: W/System.err(1015): java.lang.NullPointerException
10-04 02:30:07.283: W/System.err(1015): at      com.example.testproject.LoginTask.doInBackground(LoginTask.java:88)
10-04 02:30:07.283: W/System.err(1015): at com.example.testproject.LoginTask.doInBackground(LoginTask.java:1)
10-04 02:30:07.283: W/System.err(1015): at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-04 02:30:07.283: W/System.err(1015): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-04 02:30:07.283: W/System.err(1015): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-04 02:30:07.283: W/System.err(1015): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-04 02:30:07.294: W/System.err(1015): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-04 02:30:07.294: W/System.err(1015): at java.lang.Thread.run(Thread.java:841)

当我调试时发现应用程序在共享首选项行崩溃时崩溃,我在最近两天被困在这里并且无法找到任何解决方案

请帮我纠正我的代码。 如果可能,请发布更正后的代码。

6 个答案:

答案 0 :(得分:1)

使用:

    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);

代替SharedPreferences prefs = main.getSharedPreferences("ProfileName", Context.MODE_PRIVATE);

答案 1 :(得分:0)

您正在doInBackground方法中执行UI操作,请记住doInBackground方法仅用于后台操作。如果要与UI交互,则使用onPostExecute方法

删除

                MainActivity.email.setText("");
                MainActivity.password.setText(""); 
             & Toast Messages 
从doinBackground

并添加onPostExecute方法

你的

  onPostExecute(){

    if(responseCode == 100) {

                MainActivity.email.setText("");
                MainActivity.password.setText("");

                main.Login();

        }
            else
            {
                Toast.makeText(c, "Username or Password wrong", Toast.LENGTH_SHORT).show();
            }



    } 
    if (resEntity == null)
    {
        Log.i("NO RESPONSE",EntityUtils.toString(resEntity));
        Toast.makeText(c, "NO RESPONSE", Toast.LENGTH_SHORT).show();
    }

答案 2 :(得分:0)

你有这个

 MainActivity main;

但你在哪里初步main?假设它是一个活动类,即使你初始化它的错误。

您可以从活动类中的sharepreferences获取值,并将param传递给asynctask doInbackground。您还可以在活动类中获取editext值,并将其传递给asynctask doInbackground

您无法从doInbackground

更新ui
MainActivity.email.setText("");
MainActivity.password.setText("");
Toast.makeText(c, "NO RESPONSE", Toast.LENGTH_SHORT).show(); 

答案 3 :(得分:0)

您无法在doInBackground方法中执行与UI相关的工作。移动onCreate()方法

中的以下行
     String semail = MainActivity.email.getText().toString();
    String spassword = MainActivity.password.getText().toString();

doInBackground返回您的请求代码,并在onPostExecute()方法中写下以下代码。

    @Override
    protected void onPostExecute(Void result)  
     { 
         f(result== 100) {
                MainActivity.email.setText("");
                MainActivity.password.setText("");
                main.Login();
           }
            else
            {
                Toast.makeText(c, "Username or Password wrong", Toast.LENGTH_SHORT).show();
            }
      }

您还没有在代码中初始化MainActivity,而是直接引用它。您应该使用当前活动的上下文,即SharedPreferences prefs = c.getSharedPreferences("ProfileName", Context.MODE_PRIVATE);

将您的上下文定义为Context c="youractivityname.this";

答案 4 :(得分:0)

您可以在后台获取SharedPreference实例。问题是您的“主”实例尚未初始化。

SharedPreferences sharedPrefs = getApplicationContext().getSharedPreferences("ProfileName", Context.MODE_PRIVATE);

答案 5 :(得分:0)

只应在doInBackground()方法中处理后台进程。您应该在onPostExecute()方法中放置稍后的代码。