Подтвердить что ты не робот

Android загружает большие файлы

Я пытаюсь загрузить большой .zip файл с веб-сервера, но у меня странное поведение, описание:

  • Я выполняю код в эмуляторе устройства, API уровня 3 (версия 1.5) с SD-картой 512 МБ. Я запускаю устройство с помощью "Wipe data user".
  • Длина размера от conexion.getContentLength() равна 7012725
  • Адрес сервера - localhost (10.0.2.2), но я пробовал с внешним сервером, и все одинаково. Я дважды проверил, что могу загрузить файл через веб-браузер.
  • У меня есть эти разрешения в файле манифеста:

-

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

Ошибка:

  • Он начинает загрузку файла, я вижу текст 10, 20, 30, 40, 50, а затем он останавливается на 60.
  • Через некоторое время эмулятор перезагрузится.

Обходные:

  • qaru.site/info/468048/...
  • Об этой блокировке wifi вопрос, что я сделал, это добавить это разрешение "android.permission.WAKE_LOCK", а затем этот фрагмент кода, но с точно такое же поведение:

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

Вот код, который он выполняет в отдельном потоке:

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();
    }

}

Любая подсказка? Большое вам спасибо.

Обновление с дополнительным описанием журнала:

Привет, Крис, я пытался узнать, что происходило сначала с этим входом в систему среда Eclipse. Вот немного подробнее о том, что (время - действие), обратите внимание, что Я изменил файл для загрузки другой в orther, чтобы сделать больше но результаты вполне то же самое:

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 ...

Может ли кто-нибудь попробовать мой код и загрузить zip файл размером 8 МБ? Это работает для вас?

4b9b3361

Ответ 1

Я только что пробовал этот код в реальном устройстве, и он отлично работает. В эмуляторе должно быть что-то странное.

Ответ 2

"Сама перезагрузка эмулятора" звучит не очень хорошо. Я бы порекомендовал вам запустить logcat на машине dev и записать в файл... то есть на машине linux dev что-то вроде

adb logcat | tee logfile

Затем посмотрите файл журнала и посмотрите, что вы можете узнать о его перезагрузке.