package com.crossbow.volley;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import com.android.volley.VolleyError;
import java.util.concurrent.BlockingQueue;
/**
*/
public class FileDispatcher extends Thread {
private BlockingQueue<FileRequest<?>> requestQueue;
private FileStack fileStack;
private FileDelivery fileDelivery;
private boolean run = true;
private boolean isRunning = false;
public FileDispatcher(@NonNull BlockingQueue<FileRequest<?>> requestQueue, @NonNull FileStack fileStack, FileDelivery fileDelivery) {
this.requestQueue = requestQueue;
this.fileStack = fileStack;
this.fileDelivery = fileDelivery;
setName("Crossbow File Thread");
}
@Override
public synchronized void start() {
run = true;
if(isRunning) {
//prevent recreating a new thread
return;
}
isRunning = true;
super.start();
}
@Override
public void run() {
super.run();
while(run) {
long startTimeMs = SystemClock.elapsedRealtime();
final FileRequest<?> fileRequest;
try {
// Take a request from the queue.
fileRequest = requestQueue.take();
if(fileRequest.isCanceled()) {
//canceled bin request
fileRequest.mark("canceled-at-stack");
fileRequest.finish();
continue;
}
} catch (InterruptedException e) {
// We may have been interrupted because it was time to quit.
if (!run) {
return;
}
continue;
}
try {
fileRequest.mark("file-operation-start");
final FileResponse parsedData = fileStack.performFileOperation(fileRequest);
if(parsedData == null) {
fileDelivery.deliverError(fileRequest, new VolleyError("FileResponse from request was null"));
}
else if (parsedData.isError()) {
fileDelivery.deliverError(fileRequest, parsedData.e);
}
else{
fileDelivery.deliverSuccess(fileRequest, parsedData);
}
}
catch (final VolleyError volleyError) {
fileDelivery.deliverError(fileRequest, volleyError);
}
catch (final Exception e) {
fileDelivery.deliverError(fileRequest, new VolleyError(e));
}
}
}
public void quit() {
run = false;
isRunning = false;
interrupt();
}
}