2011-09-13 18 views
5

Estoy creando una aplicación de Android y necesito descargar un archivo de una url, que es de 33 MB de tamaño.Android: excepción de "fin inesperado de la secuencia" descarga de archivos de gran tamaño

Aquí la tarea de descarga:

try { 
      int MAX_BUFFER_SIZE = 4096; 
      URL mUrl = new URL(params[0]); 
      HttpURLConnection connection = (HttpURLConnection) mUrl.openConnection(); 
      connection.setRequestMethod("GET"); 
      long length = connection.getContentLength(), downloaded = 0; 
      int read; 
      byte [] buffer = new byte[(((int)length) > MAX_BUFFER_SIZE) ? MAX_BUFFER_SIZE : (int)length]; 
      String filename = getFilename(mUrl); 
      File file = new File (SDCARD_ROOT); 
      if (!file.exists() || !file.isDirectory()){ 
       file.mkdir(); 
      } 
      this.filename = filename; 
      file = new File (SDCARD_ROOT + this.filename); 
      FileOutputStream fos = new FileOutputStream (file); 
      //Start downloading 
      InputStream stream = connection.getInputStream(); 

      while ((read=stream.read(buffer)) > -1){ 
       fos.write(buffer, 0, read); 
       downloaded += read; 
       publishProgress((int) ((float) downloaded/length * 100)); 
      } 
      fos.close(); 
      return 1; 
     } catch (Exception e){ 
      Log.e("REV-PARTS", "Revolver parts error in DownloadTask: " + e.getMessage()); 
      return 2; 
     } 

Funciona bien con archivos pequeños (1-15 mb), pero devolverá un "inesperado final de la corriente" excepción con archivos de gran tamaño. Gracias de antemano.

+0

¿Qué llamada arroja la excepción? 'stream.read()'? –

+1

Sí, stream.read – Gnufabio

+0

@Gnufabio ¿Pudo solucionar este problema? –

Respuesta

-2

mientras se captura la excepción, trato el método downContinue(), puedo mostrar mi código: método

private void downloadApk() { 
    thread1 = new Thread() { 
     public void run() { 
      File oFile = null; 
      try { 
       URL url = new URL(PQGLApplication.resrootURL + "apk/PQGLMap.apk"); 
       HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
       ReadableByteChannel channel = 
         Channels.newChannel(urlConnection.getInputStream()); 
       oFile = 
         new File(Environment.getExternalStorageDirectory().getAbsolutePath() 
           + "/" + "hy_ht_new/" + "test2" + ".apk"); 
       oFile.setWritable(true); 
       oFile.setReadable(true); 
       if (oFile.exists()) { 
        oFile.delete(); 
       } 
       FileOutputStream fos = new FileOutputStream(oFile); 
       fileSize = urlConnection.getContentLength(); 
       ByteBuffer buffer = ByteBuffer.allocate(1024); 
       int noOfBytes = 0; 
       byte[] data = null; 
       sendApkMessage(0, 0); 
       while ((noOfBytes = channel.read(buffer)) > 0) { 
        data = new byte[noOfBytes]; 
        System.arraycopy(buffer.array(), 0, data, 0, noOfBytes); 
        buffer.clear(); 
        fos.write(data, 0, noOfBytes); 
        downLoadFileSize += noOfBytes; 
        sendApkMessage(1, downLoadFileSize); 
       } 
       fos.flush(); 
       fos.close(); 
       channel.close(); 
       sendApkMessage(2, oFile.getAbsolutePath()); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       downContinue(); 
      } 
     }; 
    }; 
    thread1.start(); 
} 

private void downContinue() { 
    continueTime++; 
    try { 
     if (continueTime == 3) { 
      continueTime = 0; 
      sendApkMessage(4, 0); 
      Log.e("what is the fucking continuetime", "continueTime" + continueTime); 
     } else { 
      URL url = new URL(PQGLApplication.resrootURL + "apk/PQGLMap.apk"); 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      File oFile = 
        new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" 
          + "hy_ht_new/" + "test2" + ".apk"); 
      RandomAccessFile oSavedFile = new RandomAccessFile(oFile, "rw"); 
      FileOutputStream fos = new FileOutputStream(oFile); 
      ReadableByteChannel channel = Channels.newChannel(urlConnection.getInputStream()); 
      // oSavedFile.seek(nPos); 
      ByteBuffer buffer = ByteBuffer.allocate(1024); 
      byte[] data = null; 
      int temp = 0; 
      sendApkMessage(3, oFile.getAbsolutePath()); 
      while ((temp = channel.read(buffer)) > 0) { 
       data = new byte[temp]; 
       System.arraycopy(buffer.array(), 0, data, 0, temp); 
       buffer.clear(); 
       fos.write(data, 0, temp); 
      } 
      fos.flush(); 
      fos.close(); 
      oSavedFile.close(); 
      sendApkMessage(2, oFile.getAbsolutePath()); 
      continueTime = 0; 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     Log.e("what is the fucking exception", e.toString() + continueTime); 
     downContinue(); 
    } 

} 

este downContinue se utiliza para la solución de este problem.At menos, el archivo se ha descargado correctamente! Vengo de China. Mi inglés no es tan bueno.

+0

¿Puede explicar el método sendApkMessage(), qué está haciendo exactamente? – skygeek

+0

No necesita establecer que el archivo de salida sea legible o escribible o pre-eliminarlo si existe. 'new FileOutputStream()' ya tiene todos esos efectos. No necesita 'System.arraycopy()' tampoco. El método se basa en un código externo no especificado. – EJP

-1

Para archivos de gran tamaño, necesita configurar el tiempo de conexión manualmente utilizando el siguiente código. He ajustar la hora a 3 minutos

connection.setConnectTimeout(180000); 
    connection.setReadTimeout(180000); 
+0

¿Cómo resolverá eso un problema de "final inesperado de la secuencia"? – EJP

+0

ya que este error se produce durante la descarga debido al tiempo de espera, –

0

tengo una respuesta para esto. debe agregar un encabezado a su conexión.

connection.setRequestProperty("Accept-Encoding", "identity"); 

esto me ayudará a you.say si ayuda ...

0

Configuración de un tamaño de fragmento parecía funcionar para mí.

connection.setChunkedStreamingMode(1048576); 
Cuestiones relacionadas