2014-09-18 5 views
0

저는 네트워킹을 처리하기 위해 Google의 Volley (AOSP의 일부)를 사용하고 있습니다. 각 요청에 대해 새로운 Listener (성공 및 오류)를 작성해야하는지, 아니면 각각을 작성하고 계속 재사용 할 수 있는지 궁금합니다. 작성 방법은 다음과 같이 정의된다Google Volley Listener

GsonRequest<Object> request = 
    new GsonRequest<Object>(Method.POST, 
     path, 
     Object.class, 
     createSuccessListener(), 
     createErrorListener()); 

합니다 (createSuccessListener()가 같은 생각을 다음, 그래서 게시하지 않습니다

예를 들어, 지금은 각 요청에 대해 새로운 리스너를 만드는거야 그것은) :

private ErrorListener mErrorListener; 
mListener = createErrorListener(); 
GsonRequest<Object> request = 
    new GsonRequest<Object>(Method.POST, 
     ... 
     ... 
     mSuccessListener, 
     mErrorListener); 
:

private ErrorListener createErrorListener() { 
    return new ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError e) { ... } 
    } 
} 

그래서 청취자의 하나 개의 인스턴스를 생성하고 내가 요청을 사방에 그것을 사용하도록 좋든 나쁘입니다

답변

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

01,

첫 번째 경우에는 메모리를 절약하고있을지라도 hasCompleted()을 호출 한 결과는 여러 요청에 사용되는 경우 신뢰할 수 없습니다 (인위적인 예가 있지만 그 점만 표시하는 것입니다). 두 번째 경우에는 하나 이상의 요청이 완료되었는지 확인할 수 있습니다. 그러나 어떤 요청에서 어떤 응답이 시작되었는지 실제로 알아야 할 경우 앱에 따라 재사용 할 수 없습니다. 구현에 달려 있습니다.

인스턴스를 다시 사용하면 메모리가 절약되고 개체 생성 시간이 줄어들며 GC 시간이 줄어 듭니다. 그러나 항상 편리한 것은 아니며 많은 시간이 코드를 읽고 사용하기가 훨씬 어려울 수 있습니다. 내가 말했듯이, 그것은 디자인 문제가 더 있습니다. 인터페이스에 관한 어떤 것도 인스턴스를 단일 요청에 바인드하지 않습니다.

+0

상태 비 저장 인터페이스의 의미를 확장 할 수 있습니까? 또한 각 요청에 대해 새로운 수신기를 생성하는 것이 메모리에 과중하지는 않습니까? – ynnadkrap

+0

@ynnadkrap이 업데이트되었습니다. 희망이 도움이되지만, 주로 귀하의 구현에 따라 다릅니다. 그러나 리스너와 요청간에 1 : 1 관계가 필요하지 않습니다. –

관련 문제