2010-10-27 11 views
11

Je suis en train de télécharger un gros fichier .zip à partir d'un serveur Web, mais j'ai un comportement bizarre, la description est:télécharger des fichiers Android grand

  • J'exécution du code dans l'émulateur de périphérique, API niveau 3 (version 1.5) avec une carte SD de 512 Mo. Je commence l'appareil avec « Wipe utilisateur de données »
  • La longueur de la taille de conexion.getContentLength() est 7012725
  • L'adresse serveur est localhost (10.0.2.2), mais je l'ai essayé avec un serveur externe et le comportement est le même. J'ai vérifié que je peux télécharger le fichier via un navigateur Web.
  • Je ces permisions dans le fichier manifeste:

-

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

L'erreur:

  • Il commence à télécharger le fichier, je peux voir le texte 10, 20, 30, 40, 50, puis s'arrête à 60.
  • Après un certain temps, l'émulateur redémarre automatiquement.

Solutions:

  • This question dans stackoverflow travaille dans l'appareil, pas dans mon cas.
  • A propos de ce verrou wifi issue ce que je l'ai fait est d'ajouter cette autorisation « android.permission.WAKE_LOCK » et ce morceau de code, mais avec exactement le même comportement:

    WifiManager.WifiLock wifilock; WifiManager manager = (WifiManager) getSystemService (Context.WIFI_SERVICE); wifilock = manager.createWifiLock ("wifilock"); wifilock.acquire(); ... wifilock.release();

Voici le code, qu'il est d'être l'exécution dans un thread séparé:

private void downloadData(){ 
    try{ 
     Log.v(TAG, "downloading data"); 

     URL url = new URL("http://10.0.2.2/1.zip"); 
     URLConnection connection = url.openConnection(); 
     connection.connect(); 

     int lenghtOfFile = connection.getContentLength(); 

     Log.v(TAG, "lenghtOfFile = "+lenghtOfFile); 

     InputStream is = url.openStream(); 

     File testDirectory = new File(Environment.getExternalStorageDirectory()+"/testDirectory/"); 
    if(!testDirectory.exists()){ 
     testDirectory.mkdir(); 
    } 

     FileOutputStream fos = new FileOutputStream(testDirectory+"/files.zip"); 

     byte data[] = new byte[1024]; 

     int count = 0; 
     long total = 0; 
     int progress = 0; 

     while ((count=is.read(data)) != -1) 
     { 
      total += count; 
      int progress_temp = (int)total*100/lenghtOfFile; 
      if(progress_temp%10 == 0 && progress != progress_temp){ 
       progress = progress_temp; 
       Log.v(TAG, "total = "+progress);  
      } 
      fos.write(data, 0, count); 
     } 

     is.close(); 
     fos.close(); 

    Log.v(TAG, "downloading finished"); 

    }catch(Exception e){ 
     Log.v(TAG, "exception in downloadData"); 
     e.printStackTrace(); 
    } 

} 

Un indice? Merci beaucoup.

Mise à jour avec plus Description du journal:

Hi Chris, I've tried to discover what was going on at first with this log in the Eclipse environment. Here are a little bit more detail about what is happening (time - action), note that I've changed the file to download for another one in orther to do more tests, but the results are quite the same:

00:00 It starts downloading: 
V/iPhoto ( 853): downloading data 
V/iPhoto ( 853): lenghtOfFile = 7732809 
V/iPhoto ( 853): total = 10 
V/iPhoto ( 853): total = 20 
V/iPhoto ( 853): total = 30 
V/iPhoto ( 853): total = 40 
V/iPhoto ( 853): total = 50 (round 00:05) 
-> Here it stops and the DDMS disconnects the device immediately 

03:40 It finish the download (not always) and the device reboots on its own: 
I/Process ( 595): Sending signal. PID: 595 SIG: 3 
I/dalvikvm( 595): threadid=7: reacting to signal 3 
D/dalvikvm( 722): GC freed 2193 objects/135808 bytes in 176 sec 
V/iPhoto ( 853): total = 60 
I/dalvikvm( 595): Wrote stack trace to '/data/anr/traces.txt' 
I/ActivityManager( 595): Process com.google.android.apps.maps:FriendService (pid 778) has died. 
I/ActivityManager( 595): Process com.android.mms (pid 732) has died. 
V/iPhoto ( 853): total = 70 
V/iPhoto ( 853): total = 80 
V/iPhoto ( 853): total = 90 
V/iPhoto ( 853): total = 100 
V/iPhoto ( 853): downloading finished 
V/iPhoto ( 853): thread finish loading 
I/Process ( 595): Sending signal. PID: 595 SIG: 9 
I/ActivityThread( 757): Removing dead content provider: settings 
I/ActivityThread( 748): Removing dead content provider: settings 
I/ActivityThread( 722): Removing dead content provider: settings 
I/ActivityThread( 700): Removing dead content provider: settings 
I/ServiceManager( 549): service 'package' died 
... services dying... 
I/ServiceManager( 549): service 'wifi' died 
E/installd( 557): eof 
E/installd( 557): failed to read size 
I/installd( 557): closing connection 
D/qemud ( 560): fdhandler_event: disconnect on fd 11 
D/qemud ( 560): fdhandler_event: disconnect on fd 12 
E/vold ( 550): Framework disconnected 
I/Zygote ( 554): Exit zygote because system server (595) has terminated 
I/ServiceManager( 549): service 'simphonebook' died 
I/ServiceManager( 549): service 'isms' died 
I/ServiceManager( 549): service 'iphonesubinfo' died 
I/ServiceManager( 549): service 'phone' died 
D/AndroidRuntime( 949): 
D/AndroidRuntime( 949): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<< 
... and starting ... 

Quelqu'un pourrait-il essayer mon code et pour télécharger un fichier zip avec la taille ronde 8MB? Est-ce que cela fonctionne pour vous?

+0

Merci pour ce code, a parfaitement fonctionné la première fois, sur mon Samsung S3. – zeeshan

Répondre

4

Je viens d'essayer ce code dans un vrai périphérique et cela fonctionne parfaitement. Il doit y avoir quelque chose de bizarre dans l'émulateur.

+0

Salut, j'ai le même problème. Avez-vous réussi à le faire fonctionner sur l'émulateur? – fhucho

+0

Bonjour, cela fonctionne sur l'émulateur sur osx, mais pas sur linux. – zegnus

+0

Utilisez-vous un SDK et un AVD à jour sur Linux? Dans le deuxième onglet à gauche du gestionnaire AVD, sélectionnez "Packages installés" et "Tout mettre à jour", il vous dira s'il y a une nouvelle version. – NoBugs

2

L '"émulation de redémarrage" ne sonne pas bien. Je vous recommande de démarrer logcat sur la machine dev et de se connecter à un fichier ... par exemple, sur une machine de développement linux quelque chose comme

adb logcat | tee logfile

Regardez ensuite le fichier journal et voyez ce que vous pouvez apprendre sur les raisons pour lesquelles il a redémarré.

+1

Salut Chris, plus de détails sur ma question originale sur ce journal. – zegnus