InputStream не закроется или потребуется вечность для

Я пытаюсь загрузить внешний mp3 во внутреннюю память. Однако файлы, которые я пытаюсь загрузить, имеют большой размер, поэтому я пытаюсь загрузить их кусками по 1 МБ, чтобы вы могли начать их воспроизведение, пока остальные загружаются. Вот мой код потока:

    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 основан на общедоступном 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