Retrofit Rxjava 实现图片下载、保存并展示

首先我们看一下Retrofit常规的用法,在不使用Rxjava的情况下,我们默认返回的是Call。

public interface ServiceApi {

	//下载文件
	@GET
	Call<ResponseBody> downloadPicFromNet(@Url String fileUrl);

}

但是如果我们要配合Rxjava使用,那么就要按照如下方式来重新定义我们的方法:

	@GET
	Observable<ResponseBody> downloadPicFromNet(@Url String fileUrl);

返回一个Observable,方法名很直观就是从网络下载图片 参数是图片的URL路径

完成请求接口的定义,我们接下来创建Retrofit 对象

		Retrofit retrofit = new Retrofit.Builder()
		.baseUrl(BASE_URL)
		.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //添加Rxjava
		.addConverterFactory(GsonConverterFactory.create()) // <span style="font-family: Arial, Helvetica, sans-serif;">定义转化器 可以将结果返回一个json格式</span>
		.build();

接下来我们给刚才定义的ServiceApi创建实例,通过上面创建的retrofit来创建

ServiceApi serviceApi = retrofit.create(ServiceApi.class);

ok,现在我们可以通过serviceApi来调用我们刚才定义的 downloadPicFromNet方法来下载一张图片,可以随意百度一张图片,复制图片地址来做测试。

		serviceApi.downloadPicFromNet("http://pic41.nipic.com/20140509/4746986_145156378323_2.jpg")
		.subscribeOn(Schedulers.newThread())//在新线程中实现该方法
		.map(new Func1<ResponseBody, Bitmap>() {

			@Override
			public Bitmap call(ResponseBody arg0) {
				if(saveFileToDisc(arg0)) {//保存图片成功
					Bitmap bitmap = BitmapFactory.decodeFile(getExternalFilesDir(null) + File.separator + "baidu.png");
					return bitmap;//返回一个bitmap对象
				}
				return null;
			}
		})
		.observeOn(AndroidSchedulers.mainThread())//在Android主线程中展示
		.subscribe(new Subscriber<Bitmap>() {

			ProgressDialog dialog = new ProgressDialog(MainActivity.this);

			@Override
			public void onStart() {
				dialog.show();
				super.onStart();
			}

			@Override
			public void onCompleted() {
				dialog.dismiss();
			}

			@Override
			public void onError(Throwable arg0) {
				Log.d(TAG, "onError ===== " + arg0.toString());
			}

			@Override
			public void onNext(Bitmap arg0) {
				imageIv.setImageBitmap(arg0);

			}
		});

上面的示例就实现了一个下载、保存、并展示的过程,跟传统的AsyncTask相比,代码很简洁,没有很多回调。当然在实际使用中还可以封装一层,把Retrofit 和 ServiceApi
的创建放在一个ServiceApiImpl的实现类中。

时间: 2024-08-30 16:52:33

Retrofit Rxjava 实现图片下载、保存并展示的相关文章

scrapy save mysql or mongo, 和图片下载保存

# -*- coding: utf-8 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html import pymongo import pymysql from scrapy import Request f

百思不得姐之图片处理(保存与下载)

一 功能图 二 讲解思路 1 回顾上一篇内容 2 创建加载图片类(同时创建xib) 3 点击图片查看大图 4 点击查看大图(查看长图) 5 model出展示图片的控制器 6 保存图片 7 封装根据网络状态展示不同的图片 三 回顾上一篇内容 1 上一篇内容讲到对整个cell的分析,通过创建一个类(XIB)来管理cell的顶部和尾部总共九个控件.然后创建三个不同的类(xib),各自负责自己的中间部分,然后根据服务器返回的帖子类型,拼接上对应的cell,展示在用户眼前. 四 处理图片 1 处理原因:

Retrofit+Rxjava+SqlBrite+SqlDelight实现多文件断点续传下载

介绍 实现功能: 多文件下载 暂停,开始断点续传 进度回调 sqlite保存下载信息 程序被杀了,重新打开继续断点下载 ... github: https://github.com/tpnet/RetrofitDownloadDemo , 有用可以点个start谢谢 本文需要SqlDelight.SqlBrite.AutoValue的知识.使用的是Rxjava1.2.9版本. 如何实现 看看流程图: 断点续传的原理为: 在请求头添加Range参数,值为bytes=从什么位置开始-. 多文件下载的

下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片

将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 #region 图片下载[使用流.WebRequest进行保存] 4 /// <summary> 5 /// 图片下载[使用流.WebRequest进行保存] 6 /// </summary> 7 /// <param name="fileUrl">图片URL地址(例如:http://img.baidu.com/video/img/video

使用URLConnection下载文件或图片并保存到本地

有时候需要从网络上面下载图片到本地进行保存,代码如下: package com.jointsky.jointframe.test; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; /** * 使用URLConnection下载文件或图片并保存到本地. * * @a

从网络下载图片,保存,并用UIImageView从保存中显示

代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIImageView *img=[[UIImageView alloc]initWithFrame:CGRectMake(50, 100, 200, 200)]; img.backgroundColor=[UIColor redColor]; [self.view addSubview:img]; /

Python爬虫获取图片并下载保存至本地的实例

今天小编就为大家分享一篇Python爬虫获取图片并下载保存在本地的实例,具有很好的参考价值,希望对大家有所帮助.一起来看看吧! 1.抓取煎蛋网上的图片 2.代码如下 * * * import urllib.request import os def url_open(url): req=urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Geck

svg保存为图片下载到本地

今天给大家说一个将svg下载到本地图片的方法,这里我不得不吐槽一下,为啥博客园不可以直接上传本地文件给大家用来直接下载分享呢,好,吐槽到此为止! 这里需要用到一个js文件,名字自己起,内容如下: (function() { const out$ = typeof exports != 'undefined' && exports || typeof define != 'undefined' && {} || this || window; if (typeof defin

iOS利用SDWebImage图片下载缓存

一.我们先来了解一下SDWebImage的使用: 1.导入框架,引入头文件: #import "UIImageView+WebCache.h" 也可以直接使用CocoaPods来引入和管理 (OC 如下) platform :ios, '7.0' pod 'SDWebImage', '~>3.8' (swift)并且要确保添加了use_frameworks,iOS版本为8.0+ platform :ios, '8.0' use_frameworks! 2.图片下载并缓存方法: /