我的Android应用程序正在使用http连接将数据发送到服务器。如果服务器收到数据,则应用程序会将数据标记为在其自己的数据库中成功传输。
有时可能会出现外部问题,导致传输无法完成。该应用应尝试稍后再次发送数据。
有什么可能确保数据到达服务器?我只能想到一项服务,它定期检查未传输的数据,但我不喜欢这种方法。
答案 0 :(得分:0)
下载了一些伪代码..
1.创建AcknowledgementManager,等待每个请求的确认。
2.确认管理员发布一个可在TIME_OUT间隔后运行的可运行的。
public void startListeningForTimeOut(CallContext callContext) {
TimeOutRunnable timeOutRunnable = new TimeOutRunnable(callContext);
mMapRunnables.put(callContext, timeOutRunnable);
mHandler.postDelayed(timeOutRunnable, TIMEOUT_DURATION);
Slog.d(TAG,
"started listening for timeout for token: " + callContext + " at: "
+ System.currentTimeMillis());
}
3.1如果AcknowledgementManager收到数据确认,它将取消该数据的可运行并在数据库中进行必要的更新。
public void stopListeningForTimeOut(CallContext callContext) {
mHandler.removeCallbacks(mMapRunnables.get(callContext));
mMapRunnables.remove(callContext);
Slog.d(TAG,
"stopped listening for timeout for token: " + callContext + " at: "
+ System.currentTimeMillis());
}
3.2如果没有收到确认,则runnable会提出"超时"到AcknowledgementManager.AcknowledgementManager重试发送数据。
public class TimeOutRunnable implements Runnable {
private static final String TAG = "TimeOutThread rupesh";
CallContext mToken;
// String mCallback;
public TimeOutRunnable(CallContext callContext) {
mToken = callContext;
// mCallback = callbackTBD;
// FIXME send proper callback class
}
@Override
public void run() {
Slog.d(TAG, "timeout occured for data id: " + mToken + " at: " + System.currentTimeMillis());
mToken.onTimeOutOccurred();
}
}
请注意:
1.在同步数据之前,请在db中输入数据,以便在重新启动应用程序之间不会丢失数据。
2.在启动同步过程之前,查询数据库以获取未传输的数据。根据数据大小,确保将数据保存在内存中以避免每次都访问数据库。
3.一旦收到数据项的确认,请对db中的该条目进行必要的更改。
4.您也可以重试' db中的标志,以便您跟踪重试次数。