我正在从我的Android应用程序调用服务器。我使用 AsyncTask 线程完成了这项工作。 现在我已经在 onPreExecute()方法中启动了Progress Dialog,如下所示:
protected void onPreExecute(){
dialog = new ProgressDialog(appcontext);
dialog.setMessage("Sending Position...");
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.show();
}
现在,在 doInBackground()方法中,我一直在执行发送数据任务。在得到响应之后,我将使用 onPostExecute()方法使用 dialog.dismiss()来停止 ProgressDialog 。
我的doInBackGround()代码
protected String doInBackground(Position... position){
InputStream inputStream = null;
String temp=null;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://10.0.2.2:8084/WebApplication5/getData");
String json = "";
JSONObject jsonObject = new JSONObject();
try {
jsonObject.accumulate("time",position[0].getTime());
json = jsonObject.toString();
StringEntity se = new StringEntity(json);
httpPost.setEntity(se);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content", "application/json");
org.apache.http.HttpResponse httpResponse = httpclient.execute(httpPost);
**// CODE ACTUALLY BLOCKS HERE UNTIL I GET A RESPONSE.(WHAT I THINKS). THOUGH WORKS 99%**
inputStream = httpResponse.getEntity().getContent();
if(inputStream!=null)
temp="sent";
}
catch (JSONException e){
e.printStackTrace();
}
catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return temp;
}
一切都很精细,但有时我没有得到回应(让它成为任何服务器错误),在这种情况下,对话框无法解除并且无限期地运行。我想限制 doInBackGround()方法的持续时间几秒钟。因此,即使没有响应,它也会转移到 onPostExecute(),我的infinte going对话框应该停止。
其次,如果我收到回复,我想将其保存到我的SharedPreferences中,所以我的问题是最好的方法是什么,即
1)我应该在 onPause()方法中进行。
2)或者,在 onStop()方法中,
3)或 onPostExecut()e 方法
或者没有意义,我可以在任何地方做到。
我的最后一个问题是共享偏好设置中存储的数据的生命周期是什么。
答案 0 :(得分:0)
您可以将其保存在您想要的位置,您可以将其保存到onPause
之后(在您的活动暂停时调用)
如果用户要修改它并且您需要保存它,请将其保存在onPause
中。
或者,如果你只需要它,你就不会再将它保存在onPostExecute
中,或者每次更改它时都会更改它。
SharedPreference
没有“生命周期”,只有在应用程序位于设备中或用户不清除数据应用程序之前,它才会存在。
对于您的doBackground
,您可以为请求添加超时。
更改您的代码块:
HttpClient httpclient = new DefaultHttpClient();
到
BasicHttpParams params = new BasicHttpParams();
ConnManagerParams.setTimeout(params, TIMEOUT_IN_MILLISECONDS); // example: 2000 for 2 seconds
HttpClient httpClient = new DefaultHttpClient(params);