2016-04-22 18 views
4

Ich bin auf der Suche nach einer Methode zum Erstellen XWalkWebResourceResponse. Mein Fall folgt.Wie erstellt man XWalkWebResourceResponse?

Ich erstelle benutzerdefinierte XWalkResourceClient Client, der alle Netzwerkanforderungen abfangen wird. Alle Anforderungen, die abgefangen werden sollen, werden als Abstract Wrapper zurückgegeben - AppWebResourceResponse.

public final class CrossWebViewClient extends XWalkResourceClient { 
    // other fields and constructor 

    CrossWebResourceResponseMapper responseMapper; 

    @Override 
    public XWalkWebResourceResponse shouldInterceptLoadRequest(XWalkView view, XWalkWebResourceRequest request) { 
     AppWebResourceRequest mappedRequest = requestMapper.toGenericRequest(request); 
     AppWebResourceResponse interceptedResponse = requestInterceptor.shouldInterceptRequest(mappedRequest); 
     if (interceptedResponse == null) { 
      return super.shouldInterceptLoadRequest(view, request); 
     } 
     return responseMapper.toTargetResponse(interceptedResponse); 
    }  
} 

Der letzte Schritt. Ich muss AppWebResourceResponse zu XWalkWebResourceResponse anpassen und das ist, wo ich ein Problem habe.

public class CrossWebResourceResponseMapper implements AppWebResourceResponse.Mapper<XWalkWebResourceResponse> { 
    @Override 
    public XWalkWebResourceResponse toTargetResponse(final AppWebResourceResponse appResponse) { 
     String mimeType = appResponse.getMimeType(); 
     String encoding = appResponse.getEncoding(); 
     int statusCode = appResponse.getStatusCode(); 
     String reasonPhrase = appResponse.getReasonPhrase(); 
     Map<String, String> headers = appResponse.getResponseHeaders(); 
     InputStream data = appResponse.getData(); 


     // ??? how to create response object? 
     XWalkWebResourceResponse response; 

     response.setMimeType(mimeType); 
     response.setEncoding(encoding); 
     response.setStatusCodeAndReasonPhrase(statusCode, reasonPhrase); 
     response.setResponseHeaders(headers); 
     response.setData(data); 
     return response; 
    } 
} 

Laut API hat öffentlichen Konstruktor new XWalkWebResourceResponse(bridge) die Brücke Objekt verbraucht, obwohl ich es versäumt haben, einen Weg zu finden, insbesondere Brücke (org.xwalk.core.internal.XWalkWebResourceResponseBridge) abgerufen werden.

Wo kann ich abrufen XWalkWebResourceResponseBridge?

Danke, im Voraus.

-Update auf 25/04/2016:

Nach Xiaofeng ist es möglich, XWalkWebResourceResponse Objekt mit XWalkResourceClient Objekt zu erstellen.

public class XWalkWebResourceResponseMapper { 
    public XWalkWebResourceResponse toTargetResponse(XWalkResourceClient client, AppWebResourceResponse appResponse) { 
     String mimeType = appResponse.getMimeType(); 
     String encoding = appResponse.getEncoding(); 
     int statusCode = appResponse.getStatusCode(); 
     String reasonPhrase = appResponse.getReasonPhrase(); 
     Map<String, String> headers = appResponse.getResponseHeaders(); 
     InputStream data = appResponse.getData(); 

     return client.createXWalkWebResourceResponse(mimeType, encoding, data, statusCode, reasonPhrase, headers); 
    } 
} 

public final class CrossWebViewClient extends XWalkResourceClient { 
    @Override 
    public XWalkWebResourceResponse shouldInterceptLoadRequest(XWalkView view, XWalkWebResourceRequest request) { 
     AppWebResourceRequest mappedRequest = requestMapper.toGenericRequest(request); 
     AppWebResourceResponse interceptedResponse = requestInterceptor.shouldInterceptRequest(mappedRequest); 
     if (interceptedResponse == null) { 
      return super.shouldInterceptLoadRequest(view, request); 
     } 
     return responseMapper.toTargetResponse(this, interceptedResponse); 
    } 
} 

Antwort

4

Danke mit Crosswalk.

Um XWalkWebResourceResponse zu erstellen, sollten Sie createXWalkResourceResponse in XWalkResourceClient verwenden, siehe here. Da es sich um ein internes Blockproblem handelt, kann der allgemeine Konstruktor nicht zum Erstellen verwendet werden.

Hier ist ein Beispiel, wie es zu benutzen: https://github.com/crosswalk-project/crosswalk/pull/3454/files

class MyResourceClient extends XWalkResourceClientInternal { 
MyResourceClient(XWalkViewInternal view) { 
    super(view); 
} 
@Override 
XWalkWebResourceResponseInternal shouldInterceptLoadRequest(XWalkViewInternal view, 
     XWalkWebResourceRequestInternal request) { 
    // Handle it here. 
    // Use createXWalkWebResourceResponse instead of "new XWalkWebResourceResponse" 
    // to create the response. 
    // Similar with before, there are two function to use: 
    // 1) createXWalkWebResourceResponse(String mimeType, String encoding, InputStream data) 
    // 2) createXWalkWebResourceResponse(String mimeType, String encoding, InputStream data, 
    //    int statusCode, String reasonPhrase, Map<String, String> responseHeaders) 
    ... 
} 

}

Sie auch später diese in XWalkView API doc sehen können.

+2

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/12132999) –

+0

@MayankPatel, danke deine Erinnerung, aber warum gibst du ein "nicht nützlich"? – Xiaofeng