0

一部にAsynctaskJson関数を使用するがありますdoInBackground。この関数は、コメントの配列を収集し、それらを という変数に配置しますKEY_COMMENTS。forループを使用しonPreExecuteてコメントを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    
            }
        }
4

1 に答える 1

0

doInBackGround: メソッドは Thread として使用されます! onPostExecute: UI スレッドとして機能します。

したがって、実行時間の長いコードをdoInBackGroundメソッドに入れてみてください。

非同期タスクが実行されると、タスクは次の 4 つのステップを経ます。

ドキュメントから

タスクが実行される前に UI スレッドで呼び出されるonPreExecute() 。このステップは、通常、タスクをセットアップするために使用されます。たとえば、ユーザー インターフェイスに進行状況バーを表示します。

doInBackground(Params...) onPreExecute() が実行を終了した直後にバックグラウンド スレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。非同期タスクのパラメーターがこのステップに渡されます。計算の結果は、このステップによって返される必要があり、最後のステップに戻されます。このステップでは、publishProgress(Progress...) を使用して、進行状況の 1 つ以上のユニットを公開することもできます。これらの値は、UI スレッドの onProgressUpdate(Progress...) ステップで発行されます。

onProgressUpdate(Progress...)。 publishProgress(Progress...) の呼び出し後に UI スレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザー インターフェイスに任意の形式の進行状況を表示するために使用されます。たとえば、進行状況バーをアニメーション化したり、テキスト フィールドにログを表示したりするために使用できます。

onPostExecute(Result)は、バックグラウンド計算が終了した後に UI スレッドで呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。

于 2013-07-06T18:53:58.087 に答える