Meine Klasse hat folgende Funktionen: https://codeshare.io/kvze0
Warum sind meine Threads nach meinem Versuch, sie herunterzufahren, noch aktiv?
public void startFtp(String address, int port, String username, String password, String filepath, String file)
{
//...parsing parameter to class variables
try {
while (download) {
downloadAndBroadcast();
}
} catch (Exception e){
Log.d(TAG, "startFtp disconnected or fails");
e.printStackTrace();
}
}
private void downloadAndBroadcast() {
beginTime = System.currentTimeMillis();
try {
URL url = new URL("http://" + serverAddress + "/" + serverFile);
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
inputStream = new BufferedInputStream(url.openStream());
long difference;
byte data[] = new byte[4094];
int count;
while ((count = inputStream.read(data)) != -1 && download) {
downloadCount += count;
long stoptime = System.currentTimeMillis();
difference = stoptime - beginTime;
if (difference > 1000 && download) {
currentSpeed = downloadCount/(difference/1000L);
averageSpeed = (averageSpeed + currentSpeed)/2;
broadcastSpeed();
downloadCount = 0;
beginTime = stoptime;
}
}
clearInputStream();
} catch (Exception e) {
Log.d(TAG, "FAIL");
e.printStackTrace();
} finally {
clearInputStream();
Log.d(TAG, "downloadAndBroadcast: finally");
}
}
private void broadcastSpeed() {
Log.d(TAG, "broadcastSpeed: ");
toMainActivityIntent = new Intent(Constants.BROADCAST_SPEED)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtra("speed", averageSpeed)
.putExtra("thread", String.valueOf(Thread.currentThread().getId()));
downloadService.sendBroadcast(toMainActivityIntent); //send to main activity, in main activity, there is a listener that analyzes Broadcast and Intent
}
private void clearInputStream() {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stopDownload() {
Log.d(TAG, "stopDownload: ");
download = false;
}
ich stopDownload()
rufen die Fäden zu stoppen. Danach habe ich meine ThreadPoolExecutor log die Fäden Status zu sehen:
[Shutting down, pool size = 4, active threads = 4, queued tasks = 0, completed tasks = 0]
Was macht meine Threads aktiv? Danke im Voraus.
Wie ich einen Thread starten:
int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
executor = new ThreadPoolExecutor(
NUMBER_OF_CORES * 2,
NUMBER_OF_CORES * 2,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>()
);
executor.execute(new Runnable() {
public void run() {
FTPDownloader ftpDownloader = new FTPDownloader(downloadService);
ftpDownloader.startFtp(server.getServer(), server.getPort(), server.getUser(), server.getPass(), server.getPath(), server.getFiledl());
if (Thread.interrupted()) {
Log.d(TAG, "run: ");
ftpDownloader.stopDownload();
}
}
});
Ich nenne executor.shutdownNow();
meiner Fäden heruntergefahren:
private class MainActivityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
executor.shutdownNow();
}
}
ich denke, man mit AsyncTask gewesen besser dran wäre. Aber trotzdem - ich kann den Aufruf von 'shutdownNow()' nicht sehen und wie soll das 'stopDownload' heißen? – Fildor
@Fildor Aufruf von shutDownNow() wird in einer anderen Funktion aufgerufen. –
Ich dachte, ich hätte die Antwort, aber ich erkannte, dass es falsch war ... Können Sie überprüfen, dass das Download-Flag tatsächlich auf false gesetzt ist? Das glaube ich nicht. – Fildor