Ich verwende Android-Universal-Image-Loader, um Bilder von Remote-Server über HTTPS
auf meiner Android-Anwendung zu laden. Um Zugriff auf Bilder zu erhalten, sollte der Client ein gültiges Token bereitstellen und manchmal kann der Server den Fehler "abgelaufenes crsf-Token" zurückgeben. Um dieses Verhalten zu behandeln, sollte ein benutzerdefinierter ImageDownloader definiert werden. Unten ist die grundlegende Implementierung der Methode, die in meiner Implementierung überschrieben werden sollte.Möglichkeiten, einen InputStream Proxy
protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {
HttpURLConnection conn = createConnection(imageUri, extra);
int redirectCount = 0;
while (conn.getResponseCode()/100 == 3 && redirectCount < MAX_REDIRECT_COUNT) {
conn = createConnection(conn.getHeaderField("Location"), extra);
redirectCount++;
}
InputStream imageStream;
try {
imageStream = conn.getInputStream();
} catch (IOException e) {
// Read all data to allow reuse connection (http://bit.ly/1ad35PY)
IoUtils.readAndCloseStream(conn.getErrorStream());
throw e;
}
if (!shouldBeProcessed(conn)) {
IoUtils.closeSilently(imageStream);
throw new IOException("Image request failed with response code " + conn.getResponseCode());
}
return new ContentLengthInputStream(new BufferedInputStream(imageStream, BUFFER_SIZE), conn.getContentLength());
}
Ich möchte es umschreiben, um ungültige Token-Fehler zu behandeln. Wenn der Server beispielsweise einen solchen Fehler zurückgibt, sollte er erkannt werden, das Token sollte neu generiert und die Anforderung wiederholt werden.
Die einzige Lösung, die ich mit oben kommen ist wie diese (verkürzte Code):
imageStream = conn.getInputStream();
byte[] body = org.apache.commons.io.IOUtils.toByteArray(imageStream);
if (body.length < 300 // high probability to contain err message
&& isInvalidToken(body)) {
// handle error
}
return new ByteArrayInputStream(body);
Ist sicher eine solche Art von Lösung zu verwenden, wenn man bedenkt ich es für Thumbnails von max 80kb Größe nur benutzen? Gibt es andere Lösungen?
Danke, dies scheint einer der 'richtigen' Wege zu sein, die beschriebene Aufgabe zu implementieren. – bvk256