Android : OutOfMemoryError lors du téléchargement vidéo - la meilleure façon de morceau ?

? AP257 @ | Original: StackOverFlow
---

Je ai le même problème http://stackoverflow.com/questions/1686446/upload-videos-in-android, mais je vais fournir quelques détails . Tout en essayant de télécharger une vidéo dans Android, je lis dans la mémoire, et si la vidéo est grande je obtenir un OutOfMemoryError .

Voici mon code :

// get bytestream to upload
videoByteArray = getBytesFromFile(cR, fileUriString);

public static byte[] getBytesFromFile(ContentResolver cR, String fileUriString) throws IOException {
    Uri tempuri = Uri.parse(fileUriString);
    InputStream is = cR.openInputStream(tempuri);
    byte[] b3 = readBytes(is);
    is.close();
    return b3;
}
public static byte[] readBytes(InputStream inputStream) throws IOException {
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    // this is storage overwritten on each iteration with bytes
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }
    return byteBuffer.toByteArray();
}

Et voici la trace ( l' erreur est renvoyée sur la ligne «____» ) :

byteBuffer.write(buffer, 0, len)

Je suppose que http://stackoverflow.com/questions/1686446/upload-videos-in-android, je ai besoin de le télécharger en morceaux . Mais ( alerte question newbie ) ce que cela signifie que je dois faire de multiples demandes de PostMethod, et collez le fichier ensemble à la fin de serveur? Ou puis-je charger le flux d'octets en mémoire en morceaux, et les coller ensemble dans le code Android ?

Si quelqu'un pouvait me donner un indice quant à la meilleure approche, je serais très reconnaissant .

---

Top 5 Répondre

1Jim Blackler @

Vous ne avez pas besoin d'obtenir l'intégralité du fichier en mémoire, puis le télécharger sur un seul coup . Appelez connection.getOutputStream ( ) et write () les octets en morceaux .

2Fedor @

Jim Blackler est absolument correct . Vous ne pouvez pas avoir la vidéo complète en mémoire dans l'octet [ ] . Donc, vous devriez lire le fichier ne pas Byte [ ], mais directement à HttpUrlConnectio.getOutputStream ( ) .

Mais même après que vous aurez toujours OutOfMemory parce HttpURLConnection met en cache toutes les données de sortie dans la mémoire et l'envoie au réseau uniquement lorsque vous êtes l'écriture complète .

Pour remplacer ce comportement, vous pouvez utiliser HttpUrlConnection.setChunkedStreamingMode () ou HttpUrlConnection.setFixedLengthStreamingMode ( ) . Si votre serveur accepte morceaux flux vous pouvez utiliser setChunkedStreamingMode ( ) . Sinon, vous devrez utiliser setFixedLengthStreamingMode . Pour utiliser setFixedLengthStreamingMode vous aurez besoin de connaître la longueur exacte de contenu avant de commencer données en continu, donc ce est un peu délicat .

Pas plus OutOfMemory à ce point .

Si vous avez votre vidéo dans le fichier, vous pouvez choisir une autre approche, beaucoup plus simple. Utilisez HttpClient et FileBody comme ça http://stackoverflow.com/questions/3038409/how-to-send-http-post-request-and-recieve-response/3038747#3038747 . Je pense qu'ils implémenter toutes les méthodes ci-dessus et vous ne aurez pas à vous inquiéter à ce sujet.

3Anthony @

Juste une petite note :

Le setChunkedStreamingMode et setFixedeLengthStreamingMode Ne pas travailler dans Android 2.1, Ils travaillent parfaite dans les 2.0 et 2.2

4Rags @

Il est préférable de scinder le fichier en parties et téléchargement. Fusionner les pièces dans le côté serveur .