RxAndroid
- еще одна лучшая альтернатива этой проблеме, и это избавляет нас от проблем создания потоков, а затем публикует результаты в потоке пользовательского интерфейса Android. Нам просто нужно указать потоки, по которым должны выполняться задачи, и все обрабатывается внутренне.
Observable<List<String>> musicShowsObservable = Observable.fromCallable(new Callable<List<String>>() {
@Override
public List<String> call() {
return mRestClient.getFavoriteMusicShows();
}
});
mMusicShowSubscription = musicShowsObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(List<String> musicShows){
listMusicShows(musicShows);
}
});
(Schedulers.io())
RxAndroid будет запускать getFavoriteMusicShows()
в другом потоке. AndroidSchedulers.mainThread()
, мы хотим наблюдать это Observable в потоке UI, т. е. хотим, чтобы наш обратный вызов onNext()
вызывался в потоке пользовательского интерфейса Задача имеет два недостатка, которые затрудняют реализацию: (a) операция перемещения по дискам на самом деле представляет собой последовательность операций чтения / записи, за которой следует удаление, а не перемещение. И во время этих операций чтения / записи может быть некоторое преобразование данных на месте; и (б) перемещение может выполняться не только оболочкой.
Что вы можете сделать, это использовать драйвер фильтра файловой системы для перехвата операций с файлами сразу, когда они происходят. Затем вам необходимо определить последовательность операций чтения и записи, выполняемых одним и тем же процессом над вашим файлом. То есть если ваш код обнаруживает, что файл читается последовательно (ПРИМЕЧАНИЕ: некоторые инструменты копирования могут считывать файл в нескольких потоках параллельно), а затем записывать аналогичные блоки данных в другой файл И после прочтения всего исходного файла удаляется, а полный содержимое файла было записано на другое место, тогда вы можете догадаться, что вы перешли на операцию перемещения файла.
Bump & amp; update: Возможно, это противоречит правилам StackOverflow, но я хотел бы указать на многих людей, приземляющихся на этой странице (и на множество похожих вопросов на SO), что я начал запрос функции на MicroSoft UserVoice, чтобы добавить обнаружение MOVE для FileSystemWatcher. Лучшим решением в долгосрочной перспективе, а не попыткой решить эту проблему, может быть заявление MicroSoft о ее исправлении. Если вы пришли сюда, потому что вам тоже нужно решение этой проблемы, рассмотрите щелчок здесь и голосование за эту функцию.
Использование высокоуровневого неограниченного api, предоставленного C #, - нет, вы не можете. Использовать FileSystemWatcher .. На том же самом приводе движущегося файла не «удалить и создать» - это «переименовать».
Если вы можете / хотите перейти на нижний уровень, тогда вы можете переместить MoveItem и MoveItems интерфейса оболочки IFileOperation и MoveFile от Kernel32.dll ... Он будет работать с большинством приложений, но требует расширения для обеспечения безопасности вашего приложения, что в большинстве случаев неприемлемо в корпоративной среде ..