Faraz Khan
Faraz Khan

Reputation: 11

Im trying to fetch data from an SQL database but i dont really know whats wrong

Im trying to fetch some data from a database but im getting, 'fatal error.. AsyncTask # 2'. Im really new to java and android studio, therefore i dont know if what ive done is the right way to go about it. but in short this is what ive tried to read the JsonObject from the database.:

Set up inputput stream (con.getInputStream) convert that into a string and send it to the JSONobject to be read and then returned.

Im using API 23 and i havent really found that much/understood much from whats available online. Help would be MUCH appreciated.

public class fetchUserDataAsyncTask extends AsyncTask<Void, Void, User> {

    User user;
    GetUserCallback userCallback;

    fetchUserDataAsyncTask(User user, GetUserCallback userCallback) {
        this.user = user;
        this.userCallback = userCallback;
    }

    @Override
    protected User doInBackground(Void... params) {

        //Use HashMap, it works similar to NameValuePair
        Map<String, String> dataToSend = new HashMap<>();

        dataToSend.put("username", user.username);
        dataToSend.put("password", user.password);

        //Encoded String - we will have to encode string by our custom method (Very easy)
        String encodedStr = getEncodedData(dataToSend);


        User returneduser = null; //for the JSONobject

        try {

            //Converting address String to URL
            URL url = new URL(Server_Address + "FetchUserData.php");

            //Opening the connection (Not setting or using CONNECTION_TIMEOUT)
            HttpURLConnection con = (HttpURLConnection) url.openConnection();

            //Post Method
            con.setRequestMethod("POST");
            //To enable inputting values using POST method
            //(Basically, after this we can write the dataToSend to the body of POST method

            con.setDoOutput(true);

            OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream());
            //Writing dataToSend to outputstreamwriter
            writer.write(encodedStr);
            //Sending the data to the server - This much is enough to send data to server
            //But to read the response of the server, you will have to implement the procedure below
            writer.flush();



            //Attempt to read data and shit but doesnt work
            StringBuilder sb = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

            String line = null;

            while ((line = reader.readLine()) != null) { //Read till there is something available
                sb.append(line + "\n");     //Reading and saving line by line - not all at once
            }

            line = sb.toString();           //Saving complete data received in string, you can do it differently

            try {
                JSONObject jObject = new JSONObject(line);//result in the ().

                if (jObject.length() == 0) {
                    returneduser = null;
                }
                    else {

                        try {
                            String name = jObject.getString("name");
                            String teamname = jObject.getString("teamname");
                            String username = jObject.getString("username");
                            String password = jObject.getString("password");
                            String emailad = jObject.getString("emailad");

                            returneduser = new User(name, teamname, username, emailad, password);

                            }  catch (JSONException e) {
                             e.printStackTrace();
                            }
                     }

                } catch (JSONException e){
                    e.printStackTrace();
                    }

             }catch (IOException e){
            e.printStackTrace();
            }

        return returneduser;
    }

    @Override
    protected void onPostExecute(User returneduser) {
        progressDialog.dismiss();
        userCallback.done(returneduser);
        super.onPostExecute(returneduser);

    }

      //get encoded data (edit)

       (private String getEncodedData(Map<String, String> data) {
    StringBuilder sb = new StringBuilder();
    for (String key : data.keySet()) {
        String value = null;
        try {
            value = URLEncoder.encode(data.get(key), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        if (sb.length() > 0)
            sb.append("&");

        sb.append(key + "=" + value);
    }
    return sb.toString();
})

}

Error Stack:

12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime: Process: pk.com.gameon.myapplication, PID: 8414
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java:309)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at libcore.net.UriCodec.encode(UriCodec.java:132)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.net.URLEncoder.encode(URLEncoder.java:57)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at pk.com.gameon.myapplication.ServerRequest.getEncodedData(ServerRequest.java:134)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at pk.com.gameon.myapplication.ServerRequest.access$000(ServerRequest.java:29)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at pk.com.gameon.myapplication.ServerRequest$fetchUserDataAsyncTask.doInBackground(ServerRequest.java:168)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at pk.com.gameon.myapplication.ServerRequest$fetchUserDataAsyncTask.doInBackground(ServerRequest.java:148)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:295)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)     
12-02 23:36:23.546 8414-8443/pk.com.gameon.myapplication E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 
12-02 23:36:24.617 8414-8441/pk.com.gameon.myapplication E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab753b90
12-02 23:36:25.453 8414-8441/pk.com.gameon.myapplication E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab755100

Upvotes: 1

Views: 87

Answers (1)

Lucas Crawford
Lucas Crawford

Reputation: 3118

Here is your culprit:

java.lang.NullPointerException: Attempt to invoke virtual method 'int 
java.lang.String.length()' on a null object reference

You are calling this in your AsyncTask:

if (jObject.length() == 0) {
    returneduser = null;
}

Instead, change it to:

if(jObject == null || jObject.length() == 0) {
    returneduser = null;
}

That way it is null-safe when it does the check. Also, you could verify this by setting break points in your code and running the debugger via Android Studio or Intellij or Eclipse depending on what you are using. This is your best bet and I suggest trying this for all bugs you cannot easily identify. In most cases, you will see the mistake quickly, and can view the values of all variables in the scope of the break points to verify that they are either as expected or not.

Another less efficient way is to drop Log.i(String, String) lines everywhere to keep track of what is happening and where the state of the application has made it to that then make it into your log cat output as well.

Upvotes: 1

Related Questions