InputStream няма да се затвори или отнема цял живот

Опитвам се да изтегля външен mp3 във вътрешната памет. Въпреки това файловете, които се опитвам да изтегля, са големи, така че се опитвам да ги изтегля на парчета от 1 MB, така че да можете да започнете да ги възпроизвеждате, докато останалата част е изтеглена. Ето кода на моя поток:

    InputStream is = null;
    OutputStream os = null;

    try {
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet( url );
        HttpResponse response = client.execute( get );

        MyLog.d( "Connection established" );

        byte[] buffer = new byte[8192];
        is = new BufferedInputStream( response.getEntity().getContent(), buffer.length );
        os = openFileOutput( filename, MODE_PRIVATE );

        int size;
        int totalSize = 0;

        while (( size = is.read( buffer ) ) != -1 && totalSize < 1048576) {
            os.write( buffer, 0, size );
            totalSize += size;
        }

        MyLog.d( "Finished downloading mix - " + totalSize + " bytes" );
    }
    catch (ClientProtocolException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        if ( os != null ) {
            try {
                os.flush();
                os.close();
            }
            catch (IOException e) {
                MyLog.e( "Failed to close output stream." );
            }
        }
        if ( is != null ) {
            try {
                is.close();
            }
            catch (IOException e) {
                MyLog.e( "Failed to close input stream." );
            }
        }
    }

Той изтегля файла добре, но когато стигне до is.close() в израза finally, той увисва. Ако чакам наистина дълго време, накрая ще се затвори. Изглежда, че все още изтегля останалата част от файла. Как да избегна това и незабавно да затворя потока?


person Jason Robinson    schedule 24.04.2011    source източник


Отговори (1)


С HTTP обикновено все още трябва да прочетете (и да изхвърлите) целия останал поток от отговори - не можете просто да затворите. Цялата струя трябва да се консумира. Не съм сигурен дали httpclient на Android е базиран на Commons httpclient 3 или 4 - с 4 можете да използвате HttpUriRequest#abort(), за да приключите по-рано. Не съм сигурен дали 3 има такава опция

Редактиране: Погледнах го и изглежда като httpclient 3 и можете да направите httpget.abort()

person MJB    schedule 24.04.2011
comment
Работи и за мен. Странно, повечето внедрявания на Android не висят. Виждал съм това само на Droid X2 досега. - person dhaag23; 02.11.2011
comment
в моя метод за прекъсване на DefaultHttpClient липсва, но mHttpClient.getConnectionManager().shutdown() работи чудесно. - person pvllnspk; 26.10.2012