我不知道该使用Retrofit还是Picasso来获取这张照片。
最好使用
Picasso,否则如果您使用
Retrofit下载图片,您需要编写大量代码来高效地加载它们。
您会很高兴知道,您可以根据自己的选择使用Retrofit和Picasso来从API中加载图像。
在继续示例之前,我想澄清一件事情,你曾误解了需要将上述JSON数据作为标头发送,但是在尝试API后,我发现它将JSON作为请求主体。
示例
RemoteApi.kt
interface RemoteApi {
@Streaming
@POST("/api/DownloadFileForAndroid")
@Throws(Exception::class)
suspend fun getImage(@Body body: ImageRequest): ResponseBody?
companion object {
fun create(): RemoteApi {
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://shop.atiafkar.ir")
.build()
return retrofit.create(RemoteApi::class.java)
}
fun getPicassoImageRequest(
builder : Picasso.Builder,
body: String,
url: String = "http://shop.atiafkar.ir/api/DownloadFileForAndroid"
) = builder.downloader(OkHttp3Downloader(getPicassoCallFactory(body)))
.build()
.load(url)
private fun getPicassoCallFactory(jsonBody : String): Call.Factory {
return Call.Factory { request ->
OkHttpClient().run {
RequestBody.create(MediaType.parse("application/json"), jsonBody).let {
newCall(request.newBuilder()
.post(it)
.addHeader("Content-Type", "application/json")
.build()
)
}
}
}
}
}
}
ImageRepository.kt
class ImageRepository(private val api: RemoteApi = RemoteApi.create()) {
companion object {
fun get() = ImageRepository()
}
suspend fun downloadImage(body : ImageRequest = ImageRequest.default): Bitmap? {
return api.getImage(body)?.run {
withContext(Dispatchers.IO) {
bytes().let {
BitmapFactory.decodeByteArray(it, 0, it.size)
}
}
}
}
fun getPicassoImageLoader(
builder : Picasso.Builder,
body: ImageRequest = ImageRequest.default
) = RemoteApi.getPicassoImageRequest(builder, body.toJson())
}
ImageViewModel.kt
class ImageViewModel(private val repository: ImageRepository) : ViewModel() {
private val _progress = MutableLiveData<Boolean>()
val progress = _progress
val liveImage = liveData {
_progress.value = true
emit(repository.downloadImage())
_progress.value = false
}
fun getPicassoImageLoader(builder: Picasso.Builder) = repository.getPicassoImageLoader(builder)
}
最后,
ImageActivity.kt
class ImageActivity : AppCompatActivity() {
private lateinit var dataBinding : ActivityImageBinding
private val imageViewModel by lazy { ViewModelProviders.of(this, ImageViewModelFactory()).get(ImageViewModel::class.java) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_image)
dataBinding.lifecycleOwner = this
dataBinding.viewModel = imageViewModel
imageViewModel.liveImage.observe(this, Observer {
dataBinding.imageView.setImageBitmap(it)
})
imageViewModel.getPicassoImageLoader(Picasso.Builder(this)).into(dataBinding.imageView2)
}
}
ImageRequest.kt
data class ImageRequest(
@field:SerializedName("UserName")
val userName: String? = null,
@field:SerializedName("ContentId")
val contentId: String? = null,
@field:SerializedName("AndroidId")
val androidId: String? = null,
@field:SerializedName("Password")
val password: String? = null,
@field:SerializedName("frame")
val frame: String? = null
) {
companion object {
val default = ImageRequest(
"ApiService",
"704",
"15df3b3a90dc5688",
"BandarAndroid",
"1"
)
}
}
fun ImageRequest.toJson() : String {
return Gson().toJson(this, ImageRequest::class.java)
}
OkHttpDownloader
,我认为您可以使用Picasso
来完成此操作。https://dev59.com/warka4cB1Zd3GeqPc2E2 - coroutineDispatcher