Android 同步连接到 REST/JSON - Volley、VolleyPlus 或 Retrofit?
Android synchronous connection to REST/JSON - Volley, VolleyPlus or Retrofit?
我为导航抽屉的不同部分(总共 7 个)使用不同的 类(POJO、解析器、JSON 请求)开发了我的所有应用程序,但是在完成所有操作之后运行 我意识到它需要使用 synchronous/blocking 请求,而 volley 通常不会这样做。所有 Volley 请求都是异步的,这意味着有时我单击一个按钮或一个抽屉项目并且它没有显示任何结果,因为异步请求没有完成。
我做了一些研究,发现了几个选项:
- Volley 自己的 RequestFuture() 方法
- VolleyPlus https://github.com/DWorkS/VolleyPlus
- 改装http://square.github.io/retrofit/
我很难找到有关发送 GET/POST 带有参数(X-Auth-Token、Content-Type、Accept application/json 请求的前两个选项的教程或示例等)并转向 Retrofit 意味着我必须扔掉我已经编写的所有代码并从头开始。
你有什么建议?此用例的任何 Volley/VolleyPlus 示例或教程?迁移到 Retrofit 是否值得重新工作?
更新:
我开始玩 Retrofit 并替换了我的一些 Volley 调用。这是完美的!它用比 Volley 更少的代码完成了我想要的。到目前为止,我没有进行自动解析,只是获取 JSON 格式的原始 HTTP 响应并发送到我之前的解析器 类 但最终我会在我得到时将它们替换掉我的头脑围绕着 POJO 和 GSON。我不得不在同步调用的主 activity 上禁用严格模式,并添加一个 try/catch 来处理一些错误。这是其中一种方法的 Retrofit 代码:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(neutronURL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(new OkHttpClient()));
builder.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("X-Auth-Token", authToken);
}
});
RestAdapter adapter = builder.build();
SecurityAPI api = adapter.create(SecurityAPI.class);
if (security == null){
pDialog.setMessage("Contacting Server...");
pDialog.show();
}
try {
Response result = api.getSecSync();
security = getRawJSON(result);
} catch (RetrofitError e) {
Log.d("Retrofit Error", e.toString());
if (e.toString().contains("Unauthorized")){
tokenExpiredAlert();
}
if (offline==0 && e.toString().contains("Unable to resolve host")){
offlineAlert();
}
}
及其调用的接口:
public interface SecurityAPI {
@Headers({
"Accept: application/json",
"Content-Type: application/json; charset=utf-8"
})
@GET("/v2.0/security-groups")
//void getSecurityContent(Callback<Response> callback);
Response getSecSync();
}
更新 2:
关于 VolleyPlus,我如何将其与此代码一起使用?我试过了,但没有成功,出现了一些关于抽象 类:
的错误
JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSON(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSON(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
//VolleySingleton.getInstance(this).addToRequestQueue(getRequest);
queue.add(getRequest);
这可能无法完全回答您的问题,但我只是分享我的意见。
作为一家初创公司的领导 Android 开发人员,我从 Volley(2013 年底)开始,运行 进入问题。我在几周内切换到 Retrofit。
同步与异步以回调的形式出现。如果存在回调,Retrofit 会异步地 运行 知道它,否则它会等待 return 值。
如果你想用VolleyPlus做同步请求,很简单。
Volley
替换为 VolleyTickle
RequestQueue
替换为 RequestTickle
request.start()
给出 NetworkResponse
.
StringRequest request = new StringRequest(Method.POST, apiUrl, null, null);
RequestTickle mRequestTickle = VolleyTickle.newRequestTickle(getApplicationContext());
mRequestTickle.addRequest(request);
NetworkResponse response = mRequestTickle.start();
if(response.StatusCode = 200){
String data = VolleyTickle.parseResponse(response);
}
使用Retrofit同步调用非常简单:
public interface TaskService {
@GET("/tasks")
List<Task> getTasks();
}
[..]
List<Task> tasks = getTasks();
和异步:
@GET("/tasks")
void getTasks(Callback<List<Task>> callback);
[..]
getTasks(new Callback<List<Task>>() {
@Override
public void success(List<Task> tasks, Response response) {
}
};
);
更多来源:
https://futurestud.io/blog/retrofit-synchronous-and-asynchronous-requests/
这两个项目中有一些名称相似但共享不同的项目 namespaces.I 有一个类似的问题,并且在我删除 volley 并将其替换为 volleyplus 以适应多个文件后不得不更改下面列出的一些项目无需使用 HttpEntity 和多部分实体即可上传:
- com.android.volley.VolleyError 至 com.android.volley.error.VolleyError
- com.android.volley.toolbox.JsonObjectRequest 至 com.android.volley.request.JsonObjectRequest
- com.android.volley.AuthFailureError 至 com.android.volley.error.AuthFailureError
我为导航抽屉的不同部分(总共 7 个)使用不同的 类(POJO、解析器、JSON 请求)开发了我的所有应用程序,但是在完成所有操作之后运行 我意识到它需要使用 synchronous/blocking 请求,而 volley 通常不会这样做。所有 Volley 请求都是异步的,这意味着有时我单击一个按钮或一个抽屉项目并且它没有显示任何结果,因为异步请求没有完成。
我做了一些研究,发现了几个选项:
- Volley 自己的 RequestFuture() 方法
- VolleyPlus https://github.com/DWorkS/VolleyPlus
- 改装http://square.github.io/retrofit/
我很难找到有关发送 GET/POST 带有参数(X-Auth-Token、Content-Type、Accept application/json 请求的前两个选项的教程或示例等)并转向 Retrofit 意味着我必须扔掉我已经编写的所有代码并从头开始。
你有什么建议?此用例的任何 Volley/VolleyPlus 示例或教程?迁移到 Retrofit 是否值得重新工作?
更新:
我开始玩 Retrofit 并替换了我的一些 Volley 调用。这是完美的!它用比 Volley 更少的代码完成了我想要的。到目前为止,我没有进行自动解析,只是获取 JSON 格式的原始 HTTP 响应并发送到我之前的解析器 类 但最终我会在我得到时将它们替换掉我的头脑围绕着 POJO 和 GSON。我不得不在同步调用的主 activity 上禁用严格模式,并添加一个 try/catch 来处理一些错误。这是其中一种方法的 Retrofit 代码:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(neutronURL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(new OkHttpClient()));
builder.setRequestInterceptor(new RequestInterceptor() {
@Override
public void intercept(RequestFacade request) {
request.addHeader("X-Auth-Token", authToken);
}
});
RestAdapter adapter = builder.build();
SecurityAPI api = adapter.create(SecurityAPI.class);
if (security == null){
pDialog.setMessage("Contacting Server...");
pDialog.show();
}
try {
Response result = api.getSecSync();
security = getRawJSON(result);
} catch (RetrofitError e) {
Log.d("Retrofit Error", e.toString());
if (e.toString().contains("Unauthorized")){
tokenExpiredAlert();
}
if (offline==0 && e.toString().contains("Unable to resolve host")){
offlineAlert();
}
}
及其调用的接口:
public interface SecurityAPI {
@Headers({
"Accept: application/json",
"Content-Type: application/json; charset=utf-8"
})
@GET("/v2.0/security-groups")
//void getSecurityContent(Callback<Response> callback);
Response getSecSync();
}
更新 2:
关于 VolleyPlus,我如何将其与此代码一起使用?我试过了,但没有成功,出现了一些关于抽象 类:
的错误 JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, novaURL, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Nova on Response", response.toString());
setNovaJSON(response.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("Nova on Error", "Error: " + error.getMessage());
setNovaJSON(error.toString());
}
}
) {
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("X-Auth-Token", authToken);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; charset=utf-8");
return params;
}
};
queue = VolleySingleton.getInstance(this).getRequestQueue();
//VolleySingleton.getInstance(this).addToRequestQueue(getRequest);
queue.add(getRequest);
这可能无法完全回答您的问题,但我只是分享我的意见。
作为一家初创公司的领导 Android 开发人员,我从 Volley(2013 年底)开始,运行 进入问题。我在几周内切换到 Retrofit。
同步与异步以回调的形式出现。如果存在回调,Retrofit 会异步地 运行 知道它,否则它会等待 return 值。
如果你想用VolleyPlus做同步请求,很简单。
Volley
替换为 VolleyTickle
RequestQueue
替换为 RequestTickle
request.start()
给出 NetworkResponse
.
StringRequest request = new StringRequest(Method.POST, apiUrl, null, null);
RequestTickle mRequestTickle = VolleyTickle.newRequestTickle(getApplicationContext());
mRequestTickle.addRequest(request);
NetworkResponse response = mRequestTickle.start();
if(response.StatusCode = 200){
String data = VolleyTickle.parseResponse(response);
}
使用Retrofit同步调用非常简单:
public interface TaskService {
@GET("/tasks")
List<Task> getTasks();
}
[..]
List<Task> tasks = getTasks();
和异步:
@GET("/tasks")
void getTasks(Callback<List<Task>> callback);
[..]
getTasks(new Callback<List<Task>>() {
@Override
public void success(List<Task> tasks, Response response) {
}
};
);
更多来源: https://futurestud.io/blog/retrofit-synchronous-and-asynchronous-requests/
这两个项目中有一些名称相似但共享不同的项目 namespaces.I 有一个类似的问题,并且在我删除 volley 并将其替换为 volleyplus 以适应多个文件后不得不更改下面列出的一些项目无需使用 HttpEntity 和多部分实体即可上传:
- com.android.volley.VolleyError 至 com.android.volley.error.VolleyError
- com.android.volley.toolbox.JsonObjectRequest 至 com.android.volley.request.JsonObjectRequest
- com.android.volley.AuthFailureError 至 com.android.volley.error.AuthFailureError