使用 dataInputStream 的中断下载
Interrupt download which uses dataInputStream
有一个非常简单的下载文件代码。
class Downloader {
private static Downloader Dinstance = null;
private boolean isAborted = false;
void setAborted(boolean isAborted) {
isAborted = true;
}
int getAborted() {
return isAborted;
}
static Downloader getInstance(@NonNull Context context) {
if (Dinstance == null)
Dinstance = new Downloaderr(context.getApplicationContext());
return Dinstance;
}
private Downloader() {
...
}
function download() {
...
try {
URL url = new URL(RequestedURL);
InputStream inputStream = url.openStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
FileOutputStream fileOutputStream = new FileOutputStream(FileName);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = dataInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, bytesRead);
if (getAborted()) {
Log.d(static_variables.TAG, "Aborting 1");
fileOutputStream.close();
Log.d(static_variables.TAG, "Aborting 2");
dataInputStream.close();
Log.d(static_variables.TAG, "Aborting 3");
inputStream.close();
Log.d(static_variables.TAG, "All closed");
file.delete();
downloadFinished = true;
Log.d(static_variables.TAG, "Returning");
return false;
}
fileOutputStream.close();
dataInputStream.close();
inputStream.close();
} catch (IOException e) {
downloadFinished = true;
return false;
}
...
}
}
在 MainActivity 中
第一个按钮侦听器(开始下载):
function onClick() {
new Thread(new Runnable() {
@Override
public void run() {
Downloader.getInstance().download(...);
}
}).start();
}
第二个按钮侦听器:
function onClick() {
Downloader.getInstance().setAborted(true);
}
下载正在进行中。
在日志中,dataInputStream.close();
的时间最长。其他研究表明,在文件完全下载之前,流不会关闭。
如何终止正在进行的 InputStream
?
在研究过程中我发现了两件事。
使用这种方法下载会中止,但是有一个缓冲区,对于小文件(在我的例子中是歌曲),它几乎无法追踪。对于500Mb的文件下载,当您在下载15Mb时按abort,然后在16-17之后它会停止。
如果你想(像我一样)更快地终止下载,那么你应该使用另一种方法。启动Thread时,保存指针int变量
Thread threadDownload = new Thread(...);
threadDownload.start();
然后中止使用
threadDownload.interrupt();
当心。您需要自己删除临时文件。您在 OutputStream
.
中使用的文件
您还会有一些缓冲区开销,但不会是 1-2Mb,而是 200-300Kb。
有一个非常简单的下载文件代码。
class Downloader {
private static Downloader Dinstance = null;
private boolean isAborted = false;
void setAborted(boolean isAborted) {
isAborted = true;
}
int getAborted() {
return isAborted;
}
static Downloader getInstance(@NonNull Context context) {
if (Dinstance == null)
Dinstance = new Downloaderr(context.getApplicationContext());
return Dinstance;
}
private Downloader() {
...
}
function download() {
...
try {
URL url = new URL(RequestedURL);
InputStream inputStream = url.openStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
FileOutputStream fileOutputStream = new FileOutputStream(FileName);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = dataInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, bytesRead);
if (getAborted()) {
Log.d(static_variables.TAG, "Aborting 1");
fileOutputStream.close();
Log.d(static_variables.TAG, "Aborting 2");
dataInputStream.close();
Log.d(static_variables.TAG, "Aborting 3");
inputStream.close();
Log.d(static_variables.TAG, "All closed");
file.delete();
downloadFinished = true;
Log.d(static_variables.TAG, "Returning");
return false;
}
fileOutputStream.close();
dataInputStream.close();
inputStream.close();
} catch (IOException e) {
downloadFinished = true;
return false;
}
...
}
}
在 MainActivity 中
第一个按钮侦听器(开始下载):
function onClick() {
new Thread(new Runnable() {
@Override
public void run() {
Downloader.getInstance().download(...);
}
}).start();
}
第二个按钮侦听器:
function onClick() {
Downloader.getInstance().setAborted(true);
}
下载正在进行中。
在日志中,dataInputStream.close();
的时间最长。其他研究表明,在文件完全下载之前,流不会关闭。
如何终止正在进行的 InputStream
?
在研究过程中我发现了两件事。
使用这种方法下载会中止,但是有一个缓冲区,对于小文件(在我的例子中是歌曲),它几乎无法追踪。对于500Mb的文件下载,当您在下载15Mb时按abort,然后在16-17之后它会停止。
如果你想(像我一样)更快地终止下载,那么你应该使用另一种方法。启动Thread时,保存指针int变量
Thread threadDownload = new Thread(...);
threadDownload.start();
然后中止使用
threadDownload.interrupt();
当心。您需要自己删除临时文件。您在 OutputStream
.
您还会有一些缓冲区开销,但不会是 1-2Mb,而是 200-300Kb。