谷歌排球听众

时间:2014-09-18 15:08:50

标签: android android-volley

我使用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);

1 个答案:

答案 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时间。然而,它并不总是方便,并且很多时候会使代码更难以阅读和使用。就像我说的,这更像是一个设计问题。接口的任何内容都不会将实例绑定到单个请求。