Android onPostExecute只调用一次

Android onPostExecute只调用一次,android,json,android-asynctask,Android,Json,Android Asynctask,我在执行AsyncTask时遇到了一个问题:onPostExecute()方法只执行一次。第二次没有更新 日志: 代码: class NextQuestionChooseSync扩展异步任务{ 私有对话框加载对话框; @凌驾 受保护的void onPreExecute(){ super.onPreExecute(); loadingDialog=ProgressDialog.show(QuestionActivity.this,“请稍候”,“正在加载…”); } @凌驾 受保护的ArrayLis

我在执行AsyncTask时遇到了一个问题:onPostExecute()方法只执行一次。第二次没有更新

日志:

代码:

class NextQuestionChooseSync扩展异步任务{
私有对话框加载对话框;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
loadingDialog=ProgressDialog.show(QuestionActivity.this,“请稍候”,“正在加载…”);
}
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
InputStream=null;
电子邮件=(字符串)getIntent().getSerializableExtra(“电子邮件”);
密码=(字符串)getIntent().getSerializableExtra(“密码”);
idSession=(int)getIntent().getSerializableExtra(“idSession”);
字符串json=null;
字符串结果=null;
字符串问题=null;
试一试{
//Http请求与我们的系统通信
HttpClient HttpClient=新的DefaultHttpClient();
列表参数=新建LinkedList();
添加(新的BasicNameValuePair(“idsession”,String.valueOf(idsession)));
HttpGet HttpGet=新的HttpGet();
URI网站=新的URI(“http://192.168.1.33:5001/nextquestion“+”?“+URLEncodedUtils.format(参数,“utf-8”);
setURI(网站);
字符串base64EncodedCredentials=Base64.encodeToString(
(电子邮件+”:“+密码).getBytes(),
Base64.无包装);
Log.d(“测试”,基本要求);
setHeader(“授权”、“基本”+base64EncodedCredentials);
HttpResponse response=httpClient.execute(httpGet);
statusCode=response.getStatusLine().getStatusCode();
HttpEntity=response.getEntity();
is=entity.getContent();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“UTF-8”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
结果=sb.toString();
Log.d(“结果1”,结果);
//管理JSON结果
JSONObject JSONObject=新JSONObject(结果);
question=jsonObject.getString(“问题”);
日志d(“结果45”,问题);
问题信息。添加(问题);
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}捕获(URISyntaxException e){
e、 printStackTrace();
}
返回问题信息;
}
@凌驾
受保护的void onPostExecute(ArrayList状态){
loadingDialog.disclose();
String question=questionInformation.get(0);
日志d(“结果50”,问题);
tv_title_question.setText(问题);
}
}
NEXTQUESTIONCHOOSEASSYNC nqca=新的NEXTQUESTIONCHOOSESYNC();
nqca.execute();
}
为什么第二次onPostExecute()方法中的值问题没有改变


谢谢你的帮助。

你说的第二次是什么意思?异步任务只能运行一次。再次执行同一任务是错误的。当我单击按钮时,将调用AsyncTask。方法onPostExecute()中的值question第一次等于doBackground中列表中添加的值,但第二次否…questionInformation在哪里声明?在任务之外?如果是这样的话,那就是一个问题——你很可能会遇到比赛条件。即使不是这样,这也是问题所在——您正在添加到该列表中,因此第二次添加的值将位于位置1,而不是0。但实际上,您不应该在异步任务之外声明该值,如果需要,您应该在onPostExecute中添加该值,而不是在DoinBackgroundThank:)这是因为questionInformation是在异步任务之外声明的。
05-31 23:15:35.261 31682-32136/com.stimulus D/result45: Qu'est ce que c'est ?
05-31 23:15:35.301 31682-31682/com.stimulus D/result50: Qu'est ce que c'est ?
05-31 23:15:38.201 31682-31878/com.stimulus D/result45: C'est quoi ?
05-31 23:15:38.261 31682-31682/com.stimulus D/result50: Qu'est ce que c'est ?
class NextQuestionChooseAsync extends AsyncTask<String, Void, ArrayList<String>> {

        private Dialog loadingDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loadingDialog = ProgressDialog.show(QuestionActivity.this, "Please wait", "Loading...");
        }

        @Override
        protected ArrayList<String> doInBackground(String... params) {

            InputStream is = null;


            email = (String) getIntent().getSerializableExtra("email");
            password = (String) getIntent().getSerializableExtra("password");
            idSession = (int) getIntent().getSerializableExtra("idSession");
            String json = null;
            String result = null;
            String question = null;

            try {
                //Http request to communicate with our system
                HttpClient httpClient = new DefaultHttpClient();

                List<BasicNameValuePair> parameters = new LinkedList<BasicNameValuePair>();
                parameters.add(new BasicNameValuePair("idsession", String.valueOf(idSession)));


                HttpGet httpGet = new HttpGet();
                URI website = new URI("http://192.168.1.33:5001/nextquestion" + "?"+ URLEncodedUtils.format(parameters, "utf-8"));
                httpGet.setURI(website);

                String base64EncodedCredentials = Base64.encodeToString(
                        (email + ":" + password).getBytes(),
                        Base64.NO_WRAP);

                Log.d("test",base64EncodedCredentials);

                httpGet.setHeader("Authorization", "Basic " + base64EncodedCredentials);

                HttpResponse response = httpClient.execute(httpGet);

                statusCode = response.getStatusLine().getStatusCode();

                HttpEntity entity = response.getEntity();
                is = entity.getContent();

                BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();

                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                result = sb.toString();

                Log.d("result1", result);

                //Manage JSON result
                JSONObject jsonObject = new JSONObject(result);

                question = jsonObject.getString("question");

                Log.d("result45",question);

                questionInformation.add(question);

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

            return questionInformation;

        }

        @Override
        protected void onPostExecute(ArrayList<String> status) {
            loadingDialog.dismiss();
            String question = questionInformation.get(0);

            Log.d("result50",question);
            tv_title_question.setText(question);

        }
    }
    NextQuestionChooseAsync nqca = new NextQuestionChooseAsync();
    nqca.execute();
}