submit():
Возвращает будущее, которое может быть использовано для получения блокировки в фоновом потоке.
get():
При необходимости ожидает завершения вычисления, а затем извлекает его результат.
В вашем случае, чтобы загрузить изображение с URL-адреса и сохранить его во внутреннем хранилище, вы должны использовать фоновый поток для этого. Если вы обращаетесь к основному потоку, ваше приложение может вызвать диалог ANR.
Здесь я продемонстрирую, как загрузить и сохранить изображение с помощью AsyncTask API
Сначала напишите класс для загрузки и сохранения изображения.
class DownloadAndSaveImageTask(context: Context) : AsyncTask<String, Unit, Unit>() {
private var mContext: WeakReference<Context> = WeakReference(context)
override fun doInBackground(vararg params: String?) {
val url = params[0]
val requestOptions = RequestOptions().override(100)
.downsample(DownsampleStrategy.CENTER_INSIDE)
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
mContext.get()?.let {
val bitmap = Glide.with(it)
.asBitmap()
.load(url)
.apply(requestOptions)
.submit()
.get()
try {
var file = it.getDir("Images", Context.MODE_PRIVATE)
file = File(file, "img.jpg")
val out = FileOutputStream(file)
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out)
out.flush()
out.close()
Log.i("Seiggailion", "Image saved.")
} catch (e: Exception) {
Log.i("Seiggailion", "Failed to save image.")
}
}
}
}
Тогда в деятельности просто позвоните
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
DownloadAndSaveImageTask(this).execute("https://s3.amazonaws.com/appsdeveloperblog/Micky.jpg")
}
}
Если вы хотите сохранить во внутреннем хранилище
var file = File(it.filesDir, "Images")
if (!file.exists()) {
file.mkdir()
}
file = File(file, "img.jpg")
Это сохранит изображение в пути data/data/yourapppackagename/files/Images/img.jpg