Android onPostExecute只调用一次
我在执行AsyncTask时遇到了一个问题: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
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();
}