简体   繁体   中英

Android: getting data from database causes app to stop responding, Stuck on progress dialog

Hey guys im creating an app where it populates a list view with data from mysql, the data that will fill the list view consists of courseid, courseName and lecturerName. However when i click the button to view the list it creates the progress dialog as it should however it gets stuck and then the application stop responding.

Below is the code to which i believe is causing the error because the logcat mentions something about doInBackground which is in this class:

the log cat file is: http://gyazo.com/950bcce9d14f267f495a4801434c6151

i really appreciate your time and help, i further want to say i am sorry about my debugging skills im still getting used to android.

public class AllCoursesActivity extends ListActivity {

//progress dialog
private ProgressDialog pDialog;

//create json parser object to understand the php files that were created
JSONParser jsonParser = new JSONParser();

ArrayList<HashMap<String, String>> courseList;

//url to get all the product list
private static String url_all_courses = "http://10.0.0.2/get_all_courses.php";


//JSON node Names
private static final String TAG_SUCCESS = "success";
private static final String TAG_COURSES = "courses";
private static final String TAG_COURSEID = "courseid";
private static final String TAG_COURSENAME = "courseName";

//products JSON array
JSONArray courses =null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.allcourses);

    //hashmap for listview
    courseList = new ArrayList<HashMap<String, String>>();

    //loading courses in background thread
    new LoadAllCourses().execute();

    //GET list view
    ListView lv = getListView();


}

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

    //before starting the background thread show some progress dialog

    protected void onPreExecute(){
        super.onPreExecute();
        pDialog = new ProgressDialog(AllCoursesActivity.this);
        pDialog.setMessage("Loading Courses. Please Wait");
        pDialog.setCancelable(false);
        pDialog.setIndeterminate(false);
        pDialog.show();
    }

    //getting all products from the URL
    @Override
    protected String doInBackground(String... args) {
        //building parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        //Getting JSON String from URL
        JSONObject json = jsonParser.makeHttpRequest(url_all_courses, "GET", params);
        //check log cat for json response
        Log.d("All Products: ", json.toString());

        try {
            //checking for success TAG
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1){
                //it means courses were found
                //Getting Array of products
                courses = json.getJSONArray(TAG_COURSES);

                //looping through all products
                for (int i = 0; i < courses.length(); i++){
                    JSONObject c = courses.getJSONObject(i);

                    //storing each JSON Item in the variable
                    String courseid = c.getString(TAG_COURSEID);
                    String coursename = c.getString(TAG_COURSENAME);

                    //creating new HASHMAP
                    HashMap<String, String> map = new HashMap<String, String>();

                    //adding each child node to hashmap key => value
                    map.put(TAG_COURSEID, courseid);
                    map.put(TAG_COURSENAME, coursename);

                    //adding Hash list to array list
                    courseList.add(map);
                }
            }else {
                //no courses found
                //go back to dashboard
                Intent i = new Intent(getApplicationContext(),MainScreenActivity.class);

                //closing all previous activities
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
            }
        }catch(JSONException e){
            e.printStackTrace();
        }

        return null;
    }


    //after completing background task Dismiss the progress dialog
    protected void onPostExecute(String file_url){
        //dismiss the dialog after getting all the courses
        pDialog.dismiss();
        //updating ui from background thread
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //updating parsed JSon data into list view
                ListAdapter adapter = new SimpleAdapter(AllCoursesActivity.this, courseList,
                        R.layout.listcourse, new String[]{TAG_COURSEID, TAG_COURSENAME},
                        new int[]{R.id.courseid, R.id.coursename});
                //updating listview
                setListAdapter(adapter);
            }
        });
    }
}

}

Edit: Sorry if i didnt include my JSONParser class

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

public JSONParser() {

}

//function to get url
//by making post or get method
public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) {

    //making the http request
    try {
        //check for request method
        if (method == "POST") {
            //request method is post
            //default http client
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            httpPost.setEntity(new UrlEncodedFormEntity(params));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        } else if (method == "GET") {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            String paramString = URLEncodedUtils.format(params, "utf-8");
            url += "?" + paramString;
            HttpGet httpGet = new HttpGet(url);

            HttpResponse httpResponse = httpClient.execute(httpGet);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        }

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

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null){
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    }catch (Exception e){
        Log.e("Buffer Error", "Error converting result" + e.toString());
    }

    //try parse the string to json object
    try {
        jObj = new JSONObject(json);
    }catch (JSONException e) {
        Log.e("JSON Parser", "Error Parsing data" + e.toString());
    }

    return jObj;
}

}

You're getting a NullPointerException and it's probably happening here:

Log.d("All Products: ", json.toString());

Search for "caused by" in your log cat output. It says that it was caused by attempting to use org.json.JSONObject.toString() on a null object. Add a check to make sure your object isn't null before you use it.

It looks like your JSON object is set to null on this line:

Log.d("All Products: ", json.toString());

Add a null check for your JsonObject before you log it.

It looks like we used the same tutorial for this, see my slightly different working implementation here:

https://github.com/dmnugent80/ShareApp/blob/master/app/src/main/java/com/share/daniel/share/MainActivity.java

Here is how to check if null:

if (json != null){
    Log.d("MyApp", "All Products: " + json.toString());
}
else{
    Log.d("MyApp", "json is null ");
}

Hey thank you for all the help but i realised what the problem was. You guys were right in that it could not return anything but this is because it wasnt connecting to the databaseproperly. i used my ip address from ip config and also i didnt link the php file correctly for example:

http://192.xxx.xx.x/android_api/get_all_courses.php

This above fixed the problem thanks for all the help and solutions

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM