0
votes

I made an login and registration system in android studio. Whenever I start the app and login or add a new user to the database I get this error:

java.lang.RuntimeException: An error occured while executing doInBackground()

here is the code:

private EditText user, pass;
private Button mSubmit, mRegister;

private ProgressDialog pDialog;


JSONParser jsonParser = new JSONParser();



private static final String LOGIN_URL = "http://10.0.2.2:1234/webservice/login.php";




private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);


    user = (EditText) findViewById(R.id.username);
    pass = (EditText) findViewById(R.id.password);


    mSubmit = (Button) findViewById(R.id.login);
    mRegister = (Button) findViewById(R.id.register);


    mSubmit.setOnClickListener(this);
    mRegister.setOnClickListener(this);

}

@Override
public void onClick(View v) {

    switch (v.getId()) {
    case R.id.login:
        new AttemptLogin().execute();
        break;
    case R.id.register:
        Intent i = new Intent(this, Register.class);
        startActivity(i);
        break;

    default:
        break;
    }
}

class AttemptLogin extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(Login.this);
        pDialog.setMessage("Attempting login...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {

        int success;
        String username = user.getText().toString();
        String password = pass.getText().toString();
        try {

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", username));
            params.add(new BasicNameValuePair("password", password));

            Log.d("request!", "starting");

            JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST",
                    params);

            Log.d("Login attempt", json.toString());


            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                Log.d("Login Successful!", json.toString());

                SharedPreferences sp = PreferenceManager
                        .getDefaultSharedPreferences(Login.this);
                Editor edit = sp.edit();
                edit.putString("username", username);
                edit.commit();

                Intent i = new Intent(Login.this, ReadComments.class);
                finish();
                startActivity(i);
                return json.getString(TAG_MESSAGE);
            } else {
                Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                return json.getString(TAG_MESSAGE);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;

    }

    protected void onPostExecute(String file_url) {

        pDialog.dismiss();
        if (file_url != null) {
            Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
        }

    }

}

}

and here is the logcat:

enter code here 02-04 16:51:58.079 12363-12496/com.example.app E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:299) at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) at java.util.concurrent.FutureTask.setException(FutureTask.java:124) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) Caused by: java.lang.NullPointerException at com.example.app.Login$AttemptLogin.doInBackground(Login.java:124) at com.example.app.Login$AttemptLogin.doInBackground(Login.java:93) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)             at java.util.concurrent.FutureTask.run(FutureTask.java:137)             at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)             at java.lang.Thread.run(Thread.java:856)

private EditText user, pass;
private Button mSubmit, mRegister;

// Progress Dialog
private ProgressDialog pDialog;

// JSON parser class
JSONParser jsonParser = new JSONParser();



// testing on Emulator:
private static final String LOGIN_URL = "http://www.skloink.com//ugur/login.php";


// JSON element ids from repsonse of php script:
private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    // setup input fields
    user = (EditText) findViewById(R.id.username);
    pass = (EditText) findViewById(R.id.password);

    // setup buttons
    mSubmit = (Button) findViewById(R.id.login);
    mRegister = (Button) findViewById(R.id.register);

    // register listeners
    mSubmit.setOnClickListener(this);
    mRegister.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
        case R.id.login:
            new AttemptLogin().execute();
            break;
        case R.id.register:
            Intent i = new Intent(this, Register.class);
            startActivity(i);
            break;

        default:
            break;
    }
}

class AttemptLogin extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(Login.this);
        pDialog.setMessage("Attempting login...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
        // Check for success tag
        int success;
        String username = user.getText().toString();
        String password = pass.getText().toString();
        try {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", username));
            params.add(new BasicNameValuePair("password", password));

            Log.d("request!", "starting");
            // getting product details by making HTTP request
            JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST",
                    params);

            // check your log for json response
            Log.d("Login attempt", json.toString());

            // json success tag
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                Log.d("Login Successful!", json.toString());
                // save user data
                SharedPreferences sp = PreferenceManager
                        .getDefaultSharedPreferences(Login.this);
                Editor edit = sp.edit();
                edit.putString("username", username);
                edit.commit();

                Intent i = new Intent(Login.this, ReadComments.class);
                finish();
                startActivity(i);
                return json.getString(TAG_MESSAGE);
            } else {
                Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                return json.getString(TAG_MESSAGE);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;

    }

    protected void onPostExecute(String file_url) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();
        if (file_url != null) {
            Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
        }

    }

}

}

1
Your problem is actually here: com.example.app.Login$AttemptLogin.doInBackground(Login.java:124) at com.example.app.Login$AttemptLogin.doInBackground(Login.java:93) - Where you're getting an NPE.fantasitcalbeastly
But what does that mean? is it unable to connect to my server?user3271587
Basically an NPE or NullPointerException means you're attempting to use something that doesn't exist, or hasn't been initialised. Can you post the section of code around lines 93-124 of Login.java. Or better still, all of it?fantasitcalbeastly
I added login.java above.user3271587
Just out of curiosity has this part ever worked: Intent i = new Intent(Login.this, ReadComments.class); finish(); startActivity(i); return json.getString(TAG_MESSAGE);? - It looks like it really shouldn't. You're setting an Intent to run, then 'closing' the parent activity, before attempting to start another, while return from the parent you've just closed :Sfantasitcalbeastly

1 Answers

1
votes

i tried this way , the reason for using callback here is to finish the current activity . and the function startLogin(),in post execute is the function where you can do other work like saving in database or other taks and do not forget to do one thing in startLogin function is to dismiss progress bar like progressDialog.dismiss(); hope this helps :) .

private void authenticate(String phoneNumber, String countryCode) {

        ServerVerify verify = new ServerVerify(this,new TaskCallback() {

            @Override
            public void done() {
                finish();

            }
        });
        verify.execute("");
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Registering.....");
        progressDialog.show();
    }
    public static class ServerVerify extends  AsyncTask<Object, Object, Object>{
        Context context;
        private TaskCallback mCallback;
        private ServerVerify(Context appContext , TaskCallback callback) {
            context = appContext.getApplicationContext();
            mCallback = callback;

        }
        @Override
        protected Object doInBackground(Object... param) {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(url);

            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
            nameValuePairs.add(new BasicNameValuePair(HTTPConstants.PHONE_NUMBER , phoneNo));

            nameValuePairs.add(new BasicNameValuePair(HTTPConstants.OS_VERSION, version));
            try {
                post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            }  catch (UnsupportedEncodingException e) {
                Log.e("UnsupportedEncodingException", "could not load url while registering user");
            }
            HttpResponse response = null;
            try {
                response =  client.execute(post);
            } catch (ClientProtocolException e) {
                Log.e("ClientProtocolException", "Error while registering user");
            } catch (IOException e) {   
                Log.e("IOException", "Error while registering user");
            }
            return response;
        }
        @Override
        protected void onProgressUpdate(Object... values) {
            super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(Object result) {
            responseJson = Utils.readResponse((HttpResponse)result);
            try {
                startLogin(context);
                mCallback.done();
            } catch (JSONException e) {
                Log.e("Json Exception", "Error in reading json response while registering User");
            }
        }


    }