【发布时间】:2014-05-30 08:41:45
【问题描述】:
问题是如何将Android手机与服务器进行通信,以便如果Activity被离开并且Activity中的调用不成功,则自动再次重复事务。刚才我使用Android的AsyncTask与服务器通信:
new AsyncTask<String, Void, List<String>>() {
@Override
protected void onPreExecute(
showWaitDialog();
}
@Override
protected void onPostExecute(List<String> msgList) {
//here I put the handling after the POST ie. error and success handling
hideWaitDialog();
if (msgList.isEmpty() {
//success handling --> starting an new Activity
} else {
errorView.setText (...);
errorLayout.setVisibility (View.VISIBLE);
}
}
@Override
protected List<String> doInBackground(String... params) {
List<String> msgs = new ArrayList<String>();
try{
//for example submitting an JSONObject
JSONObject result = HttpUtils.sendHttpPost(
AppConstants.WEB_URL, jsonObject);
//error handling on the result
boolean hasErrors = JsonResult.isOk(result);
if (hasErrors) {
// adding errors to msgs list
String[] errorMessages = JsonResult.getErrorMessages (result,...);
fillList (msgs, errorMessages);
return msgs;
}
} catch (CommunicationError er) {
msgs.add (er...);
}
return msgs;
}
}
这种方法的问题是,如果我没有成功传输数据,我必须留在同一个 Activity 中。到目前为止,我向用户显示了一条错误消息,他负责通过按钮再次将结果提交给服务器。 我正在寻找的是一些在内存中保持持久性的活动,在没有进行传输的情况下稍后运行。
作为一个应用案例,如果我按下该航点,我会使用它来动态上传地图中航点的图片。在某些情况下,与移动服务提供商的连接可能不可用(山脉、森林、远离天线)。然后我想离开地图Activity,切换到这个航点的详细视图。在成功案例中,我将图片放入我的模型类并进行序列化。如果用户再次单击同一航点,则不会再次加载图片。在不成功的情况下,我不想等待用户点击航路点来检索图像。事实上,我需要一个后台任务,某种队列,在通信部分返回肯定结果并且图像可以写入模型之前,无法检索已经访问过的航点的图片。下次用户按下 Waypoint 时,图片就会出现。
是否有任何最佳实践来实现这样的代码? 周围有例子吗? 有没有更好的方法来做到这一点?
【问题讨论】:
标签: java android android-asynctask background-process server-communication