我使用Google的Volley(AOSP的一部分)来处理我的网络。我想知道我是否应该为每个请求创建新的监听器(成功和错误),或者可以为每个请求创建一个并继续重用它们?
例如,我现在正在为每个请求创建一个新的侦听器:
GsonRequest<Object> request =
new GsonRequest<Object>(Method.POST,
path,
Object.class,
createSuccessListener(),
createErrorListener());
创建方法定义为(createSuccessListener()遵循相同的想法,所以我不会发布它):
private ErrorListener createErrorListener() {
return new ErrorListener() {
@Override
public void onErrorResponse(VolleyError e) { ... }
}
}
创建一个侦听器实例并在我提出请求的任何地方使用它是好还是坏:
private ErrorListener mErrorListener;
mListener = createErrorListener();
GsonRequest<Object> request =
new GsonRequest<Object>(Method.POST,
...
...
mSuccessListener,
mErrorListener);
答案 0 :(得分:0)
这真的是一个偏好的问题。两者都是接口,因此它们本身就是无状态的。除非您的实施不期望重复使用,否则重复使用它们无害。
即
未正确处理状态
public class UseOnlyOnceListener implements Listener<Object> {
boolean hasCompletedAlready;
public UseOnlyOnceListener() {
this.hasCompletedAlready = false;
}
public void onResponse(T response) {
this.hasCompletedAlready = ! hasCompletedAlready;
}
public boolean hasCompleted() {
return this.hasCompletedAlready;
}
}
<强> VS 强>
public class ReusableListener implements Listener<Object> {
private boolean hasCompletedAlready;
public ReusableListener() {
hasCompletedAlready = false;
}
public void onSuccess(Object response) {
this.hasCompletedAlready = true;
}
public boolean hasCompleted() {
return this.hasCompletedAlready;
}
}
<强> VS 强>
public class ReusableResponses implements Listener<Pair<Request, Object>> {
private Queue<Pair<Pair<Request, Object>> responses;
public ReusableListener() {
responses = new LinkedList<Pair<Request, Object>();
}
public void onSuccess(Pair<Request, Object> response) {
responses.enqueue(pair);
}
public boolean hasCompleted() {
return !responses.isEmpty();
}
public List<Pair<Request, Object>> getCompletedResponses() {
return new ArrayList<Pair<Request, Object>>(responses);
}
}
在第一种情况下,即使您可能正在保存内存,如果用于多个请求,调用hasCompleted()
的结果也不可靠(我知道这是一个人为的例子,但它只是为了显示这一点)。第二种情况,您可以确定至少有一个请求已完成。但是,根据您的应用程序,如果您确实需要知道哪个响应源自哪个请求,则可能无法重复使用。这取决于您的实施。
重用实例可以节省内存,并缩短对象创建时间,并缩短GC时间。然而,它并不总是方便,并且很多时候会使代码更难以阅读和使用。就像我说的,这更像是一个设计问题。接口的任何内容都不会将实例绑定到单个请求。