@Override public void run() { final int bufferSize = 1024; final byte[] buf = new byte[bufferSize]; int readlen; int readSize = bufferSize; long total = 0; try { while ((readlen = _stream.read(buf, 0, readSize)) != 0) { _file.write(buf, 0, readlen); _handler.sendProgressUpdateMessage(readlen); total += readlen; if (total >= _readCap) { break; } final int remain = (int) (_readCap - total); if (remain < bufferSize) { readSize = remain; } } } catch (final IOException e) { e.printStackTrace(); } finally { try { _stream.close(); } catch (final Exception e) { e.printStackTrace(); } try { _file.close(); } catch (final Exception e) { e.printStackTrace(); } } synchronized (Downloader.this) { _threadFinishedCount++; Downloader.this.notify(); } }