InputStream не закрывается или занимает вечно - PullRequest
6 голосов
/ 25 апреля 2011

Я пытаюсь загрузить внешний 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, он зависает. Если я подожду действительно долгое время, оно в конце концов закроется. Кажется, что он все еще загружает остальную часть файла. Как мне избежать этого и немедленно закрыть поток?

1 Ответ

7 голосов
/ 25 апреля 2011

При использовании HTTP вам обычно все равно приходится читать (и выбрасывать) весь остаток потока ответов - вы не можете просто закрыть его.Весь поток должен быть израсходован.Я не уверен, что httpclient для Android основан на общем httpclient 3 или 4 - с 4 вы можете использовать HttpUriRequest # abort (), чтобы досрочно завершить работу.Не уверен, если 3 имеет такую ​​опцию

Редактировать: посмотрел его, и он выглядит как httpclient 3, и вы можете сделать httpget.abort ()

...