2012-03-08 4 views
1

네트워크가 다운 된 경우에도 작동 할 수있는 응용 프로그램을 만들려고합니다. 아이디어는 RequestFactory에서 반환 된 데이터를 localStorage에 저장하고 네트워크를 사용할 수없는 경우 localStorage를 사용하는 것입니다. 내 문제 - 정확하게 서버 오류 (5XX, 4XX, ...)와 네트워크 오류를 구별하는 방법을 잘 모르겠습니다. ,,RequestFactory 및 오프라인 클라이언트

감사 는 (나는 두 경우 모두 내 Receiver.onFailure()가 호출 될 것이라고 가정하지만, 난 여전히이 상황을 식별하는 방법을 모른다)

어떤 도움을 주시면 감사하겠습니다 길 라드을.

답변

1

인터넷에 연결되어 있지 않아도 응답 코드는 요청 때문에 응답 코드가 액세스 할 수있는 네트워크의 실패했음을 확인하는 RequestFactory으로 0

입니다. RequestTransport가 가장 좋은 장소 인 것 같습니다.

다음은 OfflineAwareRequestTransport의 대략적인 구현입니다.

public class OfflineAwareRequestTransport extends DefaultRequestTransport { 

    private final EventBus eventBus; 
    private boolean online = true; 

    public OfflineAwareRequestTransport(EventBus eventBus) { 
    this.eventBus = eventBus; 
    } 

    @Override 
    public void send(final String payload, final TransportReceiver receiver) { 

    // super.send(payload, proxy); 
    RequestBuilder builder = createRequestBuilder(); 
    configureRequestBuilder(builder); 

    builder.setRequestData(payload); 
    builder.setCallback(createRequestCallback(receiver, payload)); 
    try { 
     builder.send(); 
    } catch (RequestException e) { 
    } 
    } 

    protected static final int SC_OFFLINE = 0; 

    protected RequestCallback createRequestCallback(final TransportReceiver receiver, 
     final String payload) { 

    return new RequestCallback() { 

     public void onError(Request request, Throwable exception) { 
     receiver.onTransportFailure(new ServerFailure(exception.getMessage())); 
     } 

     public void onResponseReceived(Request request, Response response) { 
     if (Response.SC_OK == response.getStatusCode()) { 
      String text = response.getText(); 
      setOnline(true); 
      receiver.onTransportSuccess(text); 
     } else if (response.getStatusCode() == SC_OFFLINE) { 
      setOnline(false); 
      boolean processedOk = processPayload(payload); 
      receiver.onTransportFailure(new ServerFailure("You are offline!", OfflineReceiver.name, 
       "", !processedOk)); 
     } else { 
      setOnline(true); 
      String message = "Server Error " + response.getStatusCode() + " " + response.getText(); 
      receiver.onTransportFailure(new ServerFailure(message)); 
     } 
     } 

    }; 
    } 
관련 문제