如何让Json Array在Asynctask - Android中运行

时间:2013-07-06 17:04:23

标签: arrays json for-loop android-asynctask

我有AsynctaskdoInBackground部分使用Json函数。该函数收集一组注释并将它们放入一个名为KEY_COMMENTS的变量中。在onPreExecute中,它使用for循环将注释放入textView,以单独选择每个注释。问题是它没有选择每个评论,它只会选择一个。如果我将循环设置为超过1次,它将使应用程序崩溃。这是我的代码,

    class loadComments extends AsyncTask<JSONObject, String, JSONObject> {


            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onProgressUpdate(String... values) {
                super.onProgressUpdate(values);

            } 

            protected JSONObject doInBackground(JSONObject... params) {
            //do your work here

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

                    return json2;



            }

            @Override
            protected void onPostExecute(JSONObject json2) {
                try {  
                    if (json2.getString(KEY_SUCCESS) != null) { 
                        registerErrorMsg.setText("");
                        String res2 = json2.getString(KEY_SUCCESS);
                        if(Integer.parseInt(res2) == 1){ 


                            JSONArray array = json2.getJSONArray(KEY_COMMENT);
                            for(int i = 0; i < 2; i++) {

                                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);


                                        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);


                                        commentView.setText(array.getString(i));
                                        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);
                            }



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

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

1 个答案:

答案 0 :(得分:0)

doInBackGround:方法用作线程! onPostExecute:充当UI线程!

因此,请尝试将您的任意长期代码放入doInBackGround方法!

执行异步任务时,任务将经历4个步骤:

来自文档

onPreExecute(),在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

doInBackground(Params ...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递给此步骤。计算结果必须由此步骤返回,并将传递回最后一步。此步骤还可以使用publishProgress(Progress ...)发布一个或多个进度单元。这些值发布在UI线程的onProgressUpdate(Progress ...)步骤中。

onProgressUpdate(Progress ...),在调用publishProgress(Progress ...)后在UI线程上调用。执行的时间是不确定的。此方法用于在后台计算仍在执行时显示用户界面中的任何形式的进度。例如,它可用于为进度条设置动画或在文本字段中显示日志。

onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。