通过一系列 Android 凌空请求进行处理的好习惯



我需要向服务器发送一系列请求。在控制台 java 应用程序中执行此操作非常简单,因为它只是执行等待结果、评估结果然后发出下一个请求的阻塞请求......

但是,我不知道如何最好地将其移植到 Android,因为我需要处理一系列操作,这些操作都在线程中处理,我无法"等待"它们完成。凌空代码很好,但如果嵌套代码中的嵌套代码中的嵌套代码,结果将是一个巨大的块。

正常顺序为:

  • 登录到服务器(如果出现问题,则停止)
  • 获取服务器状态
  • 根据状态获取更多数据。

在 Android 中,请求的代码现在如下所示:

JsonObjectRequest jsonRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
int myResult = response.getInt("result");
if (myResult!=0) {
throw new RuntimeException("Bad foo!");
} else {
/* ...and here there's my problem. Here I would 
normally create the next step (= the next  
"jsonRequest = new JsonObjectRequest..." including the 
entailed anonymous handler routine. But that would 
lead to a giantly nested code. For you code-gurus: 
How to solve that and still produce beautiful 
readable code? */
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
MyApplication.getInstance().getRequestQueue().add(jsonRequest);

另外:在控制台应用程序中,很容易将登录代码打包到一个函数中并出于多种目的调用它。

private void RenameDaFiles() {
LoginToServer();  // performs an internet request, in volley that starts a thread
GetData();
RenameFiles(); 
}
private void DeleteDaFiles() {
LoginToServer();
GetSomeOtherData();
DeleteFiles(); 
}

使用colley 我不能使用这种程序方法,因为即使请求没有完成,调用 volley 也会立即返回。我怎样才能做到最好?

提前非常感谢!

我问自己同样的问题,这就是我想出的:我为请求链中的每个请求编写了一个私有方法。第一种方法在完成后调用第二个方法,当它自己完成时调用第三个方法,依此类推。

最后一个方法调用每次传递给下一个方法的结果处理程序。

因此,实际上它的作用与嵌套匿名类相同。但我认为它的可读性更好。

区号

sendFirstRequest(new Consumer<JSONObject>() {
@Override
public void accept(JSONObject result) {
Log.d(TAG, "accept: result = " + result);
}
});

请求链

private void sendFirstRequest(final Consumer<JSONObject> resultConsumer) {
requestQueue.add(new JsonObjectRequest(
Request.Method.GET,
"www.google.de",
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
sendSecondRequest(resultConsumer); // <-- chaining
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
));
}
private void sendSecondRequest(final Consumer<JSONObject> resultConsumer) {
requestQueue.add(new JsonObjectRequest(
Request.Method.GET,
"www.google.de",
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
sendLastRequest(resultConsumer); // <-- chaining
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
));
}
private void sendLastRequest(final Consumer<JSONObject> resultConsumer) {
requestQueue.add(new JsonObjectRequest(
Request.Method.GET,
"www.google.de",
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
resultConsumer.accept(response); // <-- final result
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
));
}

每当我遇到"异步链问题"时,我都会使用该模式。

为了简化示例,我假设RequestQueue被定义为一个字段。

另外,请注意,Java 8 功能接口(如Consumer)仅在 API 级别 24 开始可用。但是,可以自己定义一个简单的版本:

public interface Consumer<T> {
void accept(T t);
}

最新更新