Я использую ThreadPoolExecutor
для выполнения нескольких длинных задач в фоновом режиме, размер пула ThreadPoolExecutor
равен 4, поэтому при добавлении более 4 задач они помещаются в очередь и когда один из 4 задач завершается, одна задача выставляется из очереди для выполнения.ThreadPoolExecutor: получить конкретный Runnable, который выполняется
Я хочу знать, есть ли способ доступа к объекту Runnable
, которые в настоящее время исполняются, а не в очереди, то есть первые 4 задачи.
Цель: Я хочу сделать это, чтобы получить текущее состояние задачи в любой заданной точке, с помощью mThreadPoolExecutor.getQueue()
Я получаю доступ к задачам, стоящим в очереди и готовым к выполнению, пожалуйста, предложите мне способ доступа к задачам, которые в настоящее время выполняются так что я могу прикрепить и удалить на нем слушатель/обработчик, когда это потребуется.
Мой Runnable класс:
public class VideoFileUploadRunner implements Runnable {
private final VideoFileSync mVideoFileSync;
private final DataService dataService;
private Handler handler;
public VideoFileUploadRunner(VideoFileSync videoFileSync, DataService dataService) {
this.mVideoFileSync = videoFileSync;
this.dataService = dataService;
}
public int getPK()
{
return mVideoFileSync.get_idPrimaryKey();
}
public void setHandler(Handler handler) {
this.handler = handler;
}
@Override
public void run() {
try {
if (mVideoFileSync.get_idPrimaryKey() < 0) {
addEntryToDataBase();
}
updateStatus(VideoUploadStatus.IN_PROGRESS);
FileUploader uploader = new FileUploader();
updateStatus(uploader.uploadFile(mVideoFileSync.getVideoFile()));
} catch (Exception e) {
updateStatus(VideoUploadStatus.FAILED);
e.printStackTrace();
}
}
private void addEntryToDataBase() {
int pk = dataService.saveVideoRecordForSync(mVideoFileSync);
mVideoFileSync.set_idPrimaryKey(pk);
}
private void updateStatus(VideoUploadStatus status) {
if (handler != null) {
Message msg = new Message();
Bundle b = new Bundle();
b.putString(AppConstants.Sync_Status, status.toString());
msg.setData(b);
handler.sendMessage(msg);
}
dataService.updateUploadStatus(mVideoFileSync.get_idPrimaryKey(), status.toString());
}
}
В Task держателе представления списка прогресс:
public void setData(VideoFileSync fileSync) {
tvIso.setText(fileSync.getVideoFile().getISO_LOOP_EQUP());
tvUnit.setText(fileSync.getVideoFile().getUnit());
tvName.setText(fileSync.getVideoFile().getLocalPath());
tvStatus.setText(fileSync.getCurentStatus().toString());
addHandleForUpdate(fileSync);
}
private void addHandleForUpdate(VideoFileSync fileSync) {
Handler.Callback callBack = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.getData()!=null)
{
tvStatus.setText(msg.getData().getString(AppConstants.Sync_Status));
}
return false;
}
};
mHadler = new Handler(Looper.getMainLooper(),callBack);
VideoFileUploadRunner runner = VideoUploadManager.getInstance().getRunnerForSyncFile(fileSync);
if(runner!=null)
runner.setHandler(mHadler);
}
в VideoUploadManager я следующий метод вернуть Runnable
объект, здесь я хочу помочь, так что я могу вернуться задачи в настоящее время выполняется.
public synchronized VideoFileUploadRunner getRunnerForSyncFile(VideoFileSync fileSync) {
Iterator<Runnable> itr = mThreadPoolExecutor.getQueue().iterator();
while (itr.hasNext()) {
VideoFileUploadRunner runner = (VideoFileUploadRunner) itr.next();
if (runner.getPK() == fileSync.get_idPrimaryKey()) {
return runner;
}
}
return null;
}
* чтобы я мог прикрепить и удалить на нем слушателя/обработчика, когда это требуется *. Можете ли вы рассказать о том, что вы подразумеваете под этим? – CKing
Я разрабатываю мобильное приложение, в котором у меня есть один экран для отображения текущего состояния задач, пользователь может закрыть приложение и вернуться к состоянию проверки. Поэтому, когда пользователь на экране, я хочу привязать обработчик к объектам runnable. – DCoder
Вместо за пределами runnable пытается найти runnable через исполнитель и прикрепить к нему слушателя .. Изнутри runnables запустить метод, привязать к внешнему слушателю и отвязать в конце метода. Поэтому вы можете публиковать свои события, подписываться и отписывать все в пределах исполняемого файла, и только текущие в настоящее время активные будут публиковать свои обновления. – Charlie