0

I have a json function that connects to a database and retrieves comments. The function is first gathers how many comments there are and then a while loop calls the function until all the comments have be retrieved. The problem is when I load my app is goes to a black screen and doesnt load the rest of the views until the Json function has completed. I want the json function to run in the background. So the app will load and the comments will load separately in the background. Here is the code the gathers all the comments,

    String usernameforcomments = db.getUserDetails();



                     registerErrorMsg = (TextView) findViewById(R.id.collectComment_error);
                     int verify = 1;
                     int verify2 = 1;
                     String offsetNumber = "null";
                     LinearLayout linear = (LinearLayout) this.findViewById(R.id.commentSection);

                     UserFunctions CollectComments = new UserFunctions();
                     JSONObject json = CollectComments.collectComments(usernameforcomments, offsetNumber);




                         int commentCycle = 1;

                  // check for comments  
                     try {  
                         if (json.getString(KEY_SUCCESS) != null) { 
                             registerErrorMsg.setText("");
                             String res2 = json.getString(KEY_SUCCESS);
                             if(Integer.parseInt(res2) == 1){ 

                                 String numberOfComments = json.getString(KEY_NUMBER_OF_COMMENTS);


                                 String offsetNumberDb = db.getOffsetNumber();


                                int numberOfComments2 = Integer.parseInt(numberOfComments) - Integer.parseInt(offsetNumberDb);
                                offsetNumber = offsetNumberDb;

                                 //if comment number is less than 15 or equal to 15
                                 if(numberOfComments2 <= 15){




                                 while (commentCycle <= numberOfComments2){

                                     JSONObject json2 = CollectComments.collectComments(usernameforcomments, offsetNumber);


                                    LinearLayout commentBox = new LinearLayout(this);
                                    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                                    LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                                     commentBox.setBackgroundResource(R.drawable.comment_box_bg);
                                    layoutParams.setMargins(0, 10, 0, 10);
                                    commentBox.setPadding(0,0,0,10);
                                     commentBox.setOrientation(LinearLayout.VERTICAL);
                                     linear.addView(commentBox, layoutParams);

                                     RelativeLayout commentBoxHeader = new RelativeLayout(this);
                                    commentBoxHeader.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
                                     commentBoxHeader.setBackgroundResource(R.drawable.comment_box_bg);
                                    commentBoxHeader.setBackgroundResource(R.drawable.comment_box_header);
                                    commentBox.addView(commentBoxHeader);


                                    TextView usernameView = new TextView(this);
                                    usernameView.setText("Posted by: " + json2.getString(KEY_USERNAME));
                                    RelativeLayout.LayoutParams usernameViewParam = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                                    usernameViewParam.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                                     usernameView.setTextColor(getResources().getColor(R.color.white));
                                     usernameView.setPadding(5, 5, 10, 5);
                                     usernameView.setTypeface(Typeface.DEFAULT_BOLD);
                                    commentBoxHeader.addView(usernameView, usernameViewParam);


                                    TextView commentView = new TextView(this);
                                    commentView.setText(json2.getString(KEY_COMMENT));
                                    LinearLayout.LayoutParams commentViewParams = new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                                    commentViewParams.setMargins(20, 10, 20, 20);
                                    commentView.setBackgroundResource(R.drawable.comment_bg);
                                     commentView.setTextColor(getResources().getColor(R.color.black)); 
                                    commentBox.addView(commentView, commentViewParams);

                                    TextView descriptionView = new TextView(this);
                                    descriptionView.setText(json2.getString(KEY_COMMENT));
                                    descriptionView.setPadding(20, 10, 20, 20);
                                    descriptionView.setLayoutParams(new LinearLayout.LayoutParams(
                                     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                                    descriptionView.setTextColor(getResources().getColor(R.color.black)); 
                                    commentBox.addView(descriptionView);

                                    RelativeLayout commentBoxButtons = new RelativeLayout(this);
                                    RelativeLayout.LayoutParams commentBoxButtonsParam = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
                                     commentBox.addView(commentBoxButtons, commentBoxButtonsParam);

                                    Button btnTag1 = new Button(this);
                                    RelativeLayout.LayoutParams btnTag1Param = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                                    btnTag1Param.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                                     btnTag1.setText("Go to " + json2.getString(KEY_PLATENUMBER));
                                     btnTag1Param.setMargins(10, 10, 10, 10);
                                     btnTag1.setBackgroundResource(R.drawable.dashboard_post);
                                     btnTag1.setTextColor(getResources().getColor(R.color.white));
                                     btnTag1.setTypeface(Typeface.DEFAULT_BOLD);
                                     btnTag1.setPadding(8, 5, 8, 5);
                                     btnTag1.setId(verify);
                                     commentBoxButtons.addView(btnTag1, btnTag1Param);

                                     Button btnTag2 = new Button(this);
                                     RelativeLayout.LayoutParams btnTag2Param = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
                                    btnTag2Param.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                                     btnTag2.setText("Go to " + json2.getString(KEY_USERNAME));
                                     btnTag2Param.setMargins(10, 10, 10, 10);
                                     btnTag2.setTypeface(Typeface.DEFAULT_BOLD);
                                     btnTag2.setBackgroundResource(R.drawable.dashboard_post);
                                     btnTag2.setTextColor(getResources().getColor(R.color.white));
                                     btnTag2.setPadding(8, 5, 8, 5);
                                     btnTag2.setId(verify2); 
                                     commentBoxButtons.addView(btnTag2, btnTag2Param);

                                    verify2 = verify2 + 1;
                                    verify = verify + 1; 
                                    offsetNumber = json2.getString(KEY_OFFSET_NUMBER);
                                    commentCycle = commentCycle + 1;

                             }//end while
                                 }//end if comment number is less than or equal to 15



                                }//end if key is == 1
                             else{
                                 // Error in registration
                                 registerErrorMsg.setText(json.getString(KEY_ERROR_MSG));
                             }//end else
                         }//end if
                     } //end try

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

How can I place this code inside an asynctask so it will run in the background.

1 Answers1

0

I'm not going to re-write the code for you but you can give it a try and then post where you are having trouble. You can update UI elements in any method other than doInBackground(). So set up your AyncTask (this SO answer of mine shows the basic structure) and if you need to do something with the UI such as showing a ProgressBar before the task begins then you can put that in onPreExecute()

Put all of your JSON converting in doInBackground() and if you need to update the UI while getting data then you can use publishProgress() from doInBackground() which will call onProgressUpdate().

If you need to return data from doInBackground() then it will return it as parameters to onPostExecute() where you can then again update the UI, call an Activity method, etc...

AsyncTask Docs

Community
  • 1
  • 1
codeMagic
  • 44,549
  • 13
  • 77
  • 93