Android与REST / JSON的同步连接 - Volley,VolleyPlus还是Retrofit?

时间:2015-01-20 10:25:11

标签: json rest android-volley synchronous retrofit

我使用Volley开发了我的所有应用程序,不同的类(POJO,Parser,JSON请求)用于导航抽屉的不同部分(总共7个)但是在完成所有操作后我发现它需要使用同步/阻塞请求哪个凌空通常没有。所有Volley请求都是异步的,这意味着有时我会点击一个按钮或抽屉项目而它没有显示任何结果,因为异步请求没有完成。

我做了一些研究,发现了几个选项:

我很难找到前2个选项的教程或示例,用于发送带参数的GET / POST请求(X-Auth-Token,Content-Type,Accept application / json等)和移动改造意味着我必须丢弃我已编写的所有代码并从头开始重新启动。

你的建议是什么?针对此用例的任何Volley / VolleyPlus示例或教程?迁移到Retrofit是否值得重新工作?

更新:

我开始玩Retrofit并取代我的一些Volley电话。它非常完美!它完全符合我的要求,甚至比Volley更少的代码。到目前为止,我还没有进行自动解析,只是以JSON格式获取原始HTTP响应并发送到我之前的解析器类,但最终我还会更换它们。 POJO和GSON。我不得不在同步调用的主活动上禁用严格模式,并添加try / catch来处理一些错误。这是其中一种方法的改造代码:

    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();

}

UPDATE2:

关于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);

4 个答案:

答案 0 :(得分:2)

这可能无法完全回答您的问题,但仅仅是我会分享我的观点。

作为一家初创公司的Android开发者,我从Volley开始(到2013年底)并遇到了问题。我在几周内切换到Retrofit。

Synchronouss vs Asynchronous以回调的形式出现。如果存在回调,则Retrofit知道以异步方式运行它,否则它等待返回该值。

答案 1 :(得分:2)

如果要将VolleyPlus用于同步请求,则非常简单。

VolleyVolleyTickle

取代

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);
    }

答案 2 :(得分:1)

使用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/

答案 3 :(得分:0)

两个中有一些同名的项目共享不同的名称空间。我有一个类似的问题,一旦我删除了凌空并用volleyplus替换它以适应多个文件上传而不必更改下面列出的一些内容使用HttpEntity和Multipart Entity:

  • 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