使用Retrofit和Rxjava下载启动图图片

原理

1.通过网络请求得到server上的图片路径

2.通过Retrofit和rxjava构建下载接口

3.通过数据流把图片保存到手机中

4.当下次打开客户端时,读取保存到手机中的图片


大致的流程就这么多,下面贴一些主要的代码

1.通过Retrofit构建下载接口

private  Retrofit retrofit;
private HttpServiceInterface httpServiceInterface;

public ImgDownManager(String url){
    retrofit = new Retrofit.Builder()
            .baseUrl(url+"/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    httpServiceInterface = retrofit.create(HttpServiceInterface.class);

}
public Observable<ResponseBody> downPic(String url){
    return httpServiceInterface.downPic(url);
}

@Streaming一定要加上,防止oom,返回的参数一定是ResponeBody
@Streaming
@GET
Observable<ResponseBody> downPic(@Url String fileUrl );


2,保存数据到对应的目录下

    public void writeResponseBodyToDisk(Context context,String url, ResponseBody body) {
        try {
            InputStream is = body.byteStream();
//            File file = new File(path, "download.jpg");
            String suffix = url.substring(url.lastIndexOf("."));
            String path =context.getFilesDir()+ File.separator+"loadingImg";
            File fileDr = new File(path);
            if(!fileDr.exists()){
                fileDr.mkdir();
            }
            File file = new File(path,"loadingImg"+suffix);
            if(file.exists()){
                file.delete();
                file= new File(path,"loadingImg"+suffix);
            }
            FileOutputStream fos = new FileOutputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            fos.flush();
            fos.close();
            bis.close();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.剩下的代码就是根据路径读取图片了,这里使用了线程池进行图片的读取,使用Handler进行读取成功的通知

ThreadPoolManager.newInstance().addExecuteTask(decodeImage);

private Runnable decodeImage = new Runnable() {

    @Override
    public void run() {
        Log.i("pengsong", "decodeFile");
        try {
            if (mLoadingBitmap == null || mLoadingBitmap.isRecycled()) {
                mLoadingBitmap = BitmapFactory.decodeFile(imgPath);
            }
            mHandler.sendEmptyMessage(SET_BITMAP);
        } catch (Exception e) {
            Log.i("pengsong", "decodeFile", e);
        } catch (OutOfMemoryError error) {
            if (mLoadingBitmap != null && !mLoadingBitmap.isRecycled()) {
                mLoadingBitmap.recycle();
                mLoadingBitmap = null;
            }
            System.gc();
        }
    }
};
private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case SET_BITMAP:
                Log.i("pengsong", "Handle SET_BITMAP message");
                if (isFinishing()) {
                    return;
                }
                if (mLoadingBitmap != null) {
                    imageView.setImageBitmap(mLoadingBitmap);
                }
                break;
        }
    }
};


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Retrofit是一个基于OkHttp的RESTful API请求库,它可以帮助我们更方便地进行网络请求和数据解析。而RxJava则是一个响应式编程库,可以让我们更加方便地处理异步操作和事件流。结合使用Retrofit、OkHttp和RxJava可以让我们更加高效地进行网络请求和数据处理。 ### 回答2: Retrofit是一个使用简单且功能强大的HTTP客户端框架,它的目的是使得网络请求变得更加容易。OkHttp是Retrofit的底层依赖框架,它是一个高效的HTTP客户端,同时也支持HTTP/2和连接池等技术。RxJava是一个响应式编程库,它强调异步和基于事件的编程方式。 Retrofit、OkHttp和RxJava的组合可以使得Android开发中的网络编程更加简单和高效。通过使用Retrofit,我们可以轻松地定义接口和请求,而OkHttp则能够处理请求的各种细节和管理连接池。最后,RxJava可以使我们以响应式的方式处理请求结果和错误,并支持各种操作符来处理异步编程,例如过滤、转换、组合和错误处理等。 因此,使用Retrofit、OkHttp和RxJava可满足App的网络请求的各种需求,包括异步处理、错误处理、缓存、断点续传、下载进度监听等等。总的来说,这种组合是非常优秀的,也是当前Android开发中网络编程的首选方案之一。 ### 回答3: Retrofit、OkHttp和RxJava都是Android开发中常用的网络操作框架。Retrofit主要用于将REST API转换为Java接口,OkHttp则是用于处理网络请求的库,而RxJava则是一个功能强大的异步编程工具。 使用Retrofit和OkHttp可以构建出优秀的HTTP客户端,而RxJava可以使得异步请求更加容易实现和管理。Retrofit使用注解方式定义API接口,将HTTP请求转换成方法调用。同时,它支持同步和异步方式进行网络请求,并自动将HTTP返回的JSON数据转换成对象。 另一方面,OkHttp是一个基于HTTP客户端的框架,可以将所有的HTTP/HTTPS请求和相应都以“拦截器”的形式进行处理。它的设计初衷是解决很多网络访问的问题,比如关于连接池、请求重试、响应压缩、TLS等内容。使用OkHttp可以方便地进行网络调用,并且具有很好的可扩展性。 RxJava的重点在于响应式编程,通过使用Observables和Subscribers,执行异步IO操作变得非常简单。它可以方便地跨线程执行异步操作,以及简洁地描述序列化和反序列化过程,提高代码的可读性和易维护性。使用RxJavaRetrofit可以将网络请求的处理逻辑和UI逻辑分开,让代码更加简洁和模块化。 综上所述,Retrofit、OkHttp和RxJava的组合可以让我们方便地进行网络请求和异步操作,,同时也简化了代码逻辑。在Android开发中使用这些框架可以提高开发效率,减少代码锅和增加代码的可读性,感觉上就像是“发现了新大陆”。这些框架已经在很多开发者中得到了广泛应用,并被持续维护和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值