任务很简单,但我希望以正确的方式做到这一点,我很想听听你的专家意见,因为我是android开发的新手。
首先,应用程序只适合我,所以我真的不关心安全性和东西。
所以我的目标是这样的:
我有大量数据需要传输到我的MYSQL数据库,对我来说最简单的方法是使用HTTP POST方法,但我担心应用程序可能卡住的部分或某些数据赢了“由于许多POST请求将会通过。
那么我应该如何使用POST请求传递数据,并确保所有请求都将逐个发送而不会跳过任何数据丢失或丢失数据?
这背后的逻辑就足够了我真的不需要代码部分。 希望我足够清楚。
答案 0 :(得分:1)
改造FTW。在Android(RESTful)上轻松实现网络,它包括Gson。 说到Gson ...你提到你可能会发许多帖子?如果是这样,您应该将数据转换为JSON,然后通过网络发送。 Google的Gson是一种将Java对象轻松转换为JSON的绝佳方式。 http://square.github.io/retrofit/ https://github.com/google/gson
答案 1 :(得分:0)
在阅读之前: 这是我实现帖子和获取的方式,这不是最好的方式,但只是满足我需求的最佳方式,随时编辑/不使用/自己实施
我个人更喜欢OkHTTP library,它易于使用且易于实施。
实施非常简单,只需在Gradle应用级
中添加此行即可implementation 'com.squareup.okhttp3:okhttp:3.9.0'
然后我为get和post调用创建了一个帮助类(我不需要很多配置,所以对我来说静态的就足够了,如果你需要更多的东西你可以轻松实现。还有超时设置为我的需求,你可以自由地改变它们。)
private String ConsumeGetRequest(String path) {
int tries = 0;
boolean isMyException = true;
while (tries <= 3 && isMyException) {
try {
isMyException = false;
tries++;
Response response = executeRequestBody(path, null);
if (response != null && response.body() != null)
return response.body().string();
else
return "";
} catch (ConnectException e) {
e.printStackTrace();
if (e.getMessage().contains("Failed to connect to") && tries <= 3) {
isMyException = true;
}
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
return "";
}
private Pair<Boolean, String> ConsumePostRequest(String path, String postData) {
int tries = 0;
String errorMsg = null;
boolean isMyException = true;
//you can ignore this while, it was for our internal reasons and it's just a check.
while (tries <= 3 && isMyException) {
try {
isMyException = false;
tries++;
Response response = executeRequestBody(path, postData);
if (response != null && response.body() != null)
return new Pair<>(response.isSuccessful(), response.body().string());
else
return new Pair<>(false, null);
} catch (ConnectException e) {
errorMsg = e.getMessage();
if (e.getMessage().contains("Failed to connect to") && tries <= 3) {
isMyException = true;
}
} catch (Exception ex) {
errorMsg = ex.getMessage();
}
}
return new Pair<>(false, errorMsg);
}
private Response executeRequestBody(String path, String postData) throws IOException {
String url = String.format("%s%s/", RuntimeHelper._baseWebServiceIP, path);
if (okHttpClient == null) {
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.readTimeout(120, TimeUnit.SECONDS)
.build();
}
Request.Builder builder = new Request.Builder().url(url);
if (postData != null && !postData.isEmpty()) {
RequestBody body = RequestBody.create(RuntimeHelper._okHttpTypeJson, postData);
builder = builder.post(body);
}
Request request = builder.build();
return okHttpClient.newCall(request).execute();
}
使用这两种方法(几个例子)我创建了我的路径,并根据我的需要调用了正确的方法。
//Post
public boolean setAlerts(String postData) {
String path = String.format("api/wfm/v1/set-alerts/%s/%s", authToken, resourceId);
return ConsumePostRequest(path, postData).first;
}
//Post
public String isAlertUpdated(String lastDownloadDate) {
String path = String.format("api/wfm/v1/is-alert-updated/%s/%s", authToken, lastDownloadDate);
return ConsumeGetRequest(path);
}
然后使用AsyncTask,您可以在不阻止UI的情况下执行操作
public class NewAlertAsyncTask extends AsyncTask<String, String, Boolean> {
Context context;
private WebApiMethodsController webApiMethodsController;
AuthenticatedUser authenticatedUser;
public NewAlertAsyncTask(Context ctx) {
this.context = ctx;
authenticatedUser = AuthenticatedUser.getIstance(context);
webApiMethodsController = new WebApiMethodsController(authenticatedUser.getAuthenticationTokenID().toString(), authenticatedUser.getResourceID().toString(), context);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
}
@Override
protected Boolean doInBackground(String... datas) {
Boolean result;
try {
result = webApiMethodsController.setAlerts(datas[0]);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return result;
}
@Override
protected void onPostExecute(Boolean s) {
if(s){
//manage succes, I use this
mCallback.onNewAlertCreated();
}
else{
//manage error
}
}
}
我的是一个非常简单的结构,您可以通过回调,状态进度,更深入的返回状态检查来实现它......
您只需使用此
调用asynctask即可 NewAlertAsyncTask newAlertAsyncTask = new NewAlertAsyncTask(getActivity());
newAlertAsyncTask.execute(gson.toJson(alertList));