gpt4 book ai didi

java - 如何正确停止线程?

转载 作者:行者123 更新时间:2023-12-01 22:18:09 25 4
gpt4 key购买 nike

我有代表下载任务单元的类。

import android.os.Environment;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

/**
* Created by Sergey Shustikov (sergey.shustikov@youshido.com) at 2015.
*/
public class DownloadTask extends Thread implements DownloadActions
{

private DownloadStateListener mListener;
private String mDownloadLink;

public DownloadTask(String downloadLink)
{
mDownloadLink = downloadLink;
}

@Override
public void cancel()
{
interrupt();
mListener.onDownloadCanceled(mDownloadLink);
}

@Override
public void setDownloadStateChangedListener(DownloadStateListener listener)
{
mListener = listener;
}

@Override
public void run()
{
int count;
try {
mListener.onDownloadStarted(mDownloadLink);
URL url = new URL(mDownloadLink);
URLConnection connection = url.openConnection();
connection.connect();

// this will be useful so that you can show a tipical 0-100%
// progress bar
int contentLength = connection.getContentLength();

// download the file
InputStream input = new BufferedInputStream(connection.getInputStream());

// Output stream
OutputStream output = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/Download/");

byte data[] = new byte[1024];

long total = 0;

while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
mListener.onDownloadProgress(mDownloadLink, (int) ((total * 100) / contentLength));

// writing data to file
output.write(data, 0, count);
}

close(connection, input, output);
mListener.onDownloadFinished(mDownloadLink);

} catch (Exception e) {
Log.e("Error: ", e.getMessage());
mListener.onDownloadFailed(mDownloadLink, new DownloadError(e.getMessage()));
}

}

private synchronized void close(URLConnection connection, InputStream input, OutputStream output)
{
try {
// flushing output
if (output != null) {
output.flush();
}
} catch (IOException e) {
e.printStackTrace();
}

// closing streams
try {
// flushing output
if (output != null) {
output.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
// flushing output
if (input != null) {
input.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

当我调用 cancel() 方法时,我需要停止下载、清除下载的数据并关闭连接。

我知道 - 关于 Java 中的停止机制有很多讨论。

我无法使用 this answer :

You can create a boolean field and check it inside run:

public class Task implements Runnable {

private volatile boolean isRunning = true;

public void run() {

while (isRunning) {
//do work
}
}
public void kill() {
isRunning = false;
}

}

To stop it just call

task.kill();

This should work.

因为它不是循环操作。

那么我怎样才能正确地做到这一点?

最佳答案

您必须中断您的(可能长时间运行的)阅读过程:

while ((count = input.read(data)) != -1 && isRunning) {
// perform reading
}

关于java - 如何正确停止线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30574076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com