Используя MediaScannerConnection.scanFile () во фрагменте? - PullRequest
0 голосов
/ 04 октября 2018

Я загружаю файл из Fragment асинхронно и хотел бы вызвать MediaScannerConnection.scanFile(), когда загрузка завершится.Я могу получить желаемый результат, если я сижу и жду окончания загрузки, не отходя от своего фрагмента (или его хостинга).Проблема, с которой я сталкиваюсь, заключается в том, что для MediaScannerConnection.scanFile() требуется контекст, и я не хочу ограничивать пользователя пребыванием в пределах Fragment / Activity только для того, чтобы контекст не был нулевым.

Как использовать MediaScannerConnection.scanFile() в фоновом режиме, чтобы я мог сканировать файлы и отображать Toast, когда сканирование завершено, в то же время перемещаясь по другим частям моего приложения (или даже вкладкимоего приложения)?

Вот как я сейчас сканирую (с контекстом):

public static void mediaScanFile(Context context, String path) {
    MediaScannerConnection.scanFile(context,
            new String[]{path}, null,
            new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.d("Tag", "Scan finished. You can view the image in the gallery now.");
                }
            });
}

1 Ответ

0 голосов
/ 04 октября 2018

Прежде всего, загрузка файла с Fragment, который может быть скоро уничтожен, не очень хорошая идея.Вы должны использовать службу переднего плана .


Если вы все еще хотите придерживаться фрагментов, в вашем случае вы можете использовать контекст приложения.

Перед началом загрузки сохраните ссылку на контекст приложения в виде поля во фрагменте.

Context appContext;

// Inside onCreateView
appContext = getContext().getApplicationContext();

Затем вы можете использовать контекст приложения для сканирования носителя.

Это не приведет кутечка памяти из-за того, что контекст приложения является единым общим экземпляром и не будет уничтожен, пока приложение не будет уничтожено.

...