第一次实践 Retrofit+RxJava 实现的 MD 风格小应用

·  阅读 2296
第一次实践 Retrofit+RxJava 实现的 MD 风格小应用
原文链接: blog.csdn.net

先贴出代码地址吧:github.com/Pr-Jiang/Ne…

近期,宣讲会也不多了,受 饿了么 sofish 的点醒,确实应该静下心来做点实际的东西。

在寝室一个人,两天半的时间,做了这一个算是比较完整的项目吧。也参考了github上的开源项目进行学习~

之前只是浅显的看了一些RxJava的文章,推荐关于RxJava最友好的文章,这一次实战,也切实体会到了Retrofit+RxJava 进行网络请求的强大,特别是在于线程切换上,真的是厉害~~

上一下预览图片吧,闪屏页面由于是动图,gif图片太大,这边不支持,所以有感兴趣的可以去github看一下

也希望大家可以star一下,帮助我在校招中寻找自己理想的offer~

小鱼在此谢过了~

这是主界面

采用了MaterialDesign风格,使用EasyRecyclerView,利用CardView将item进行包裹

数据来 自天行数据 

private void easyGetDatas() {  
        Retrofit retrofit = new Retrofit.Builder()  
                .baseUrl(NewsFragment.BASE_URL)  
                .addConverterFactory(GsonConverterFactory.create())    /* 添加Gson转换器 */  
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  /* 添加RxJava适配器 */  
                .build();  
        NewsService newsService = retrofit.create(NewsService.class);  
        newsService.getNewsDatas(NewsFragment.APIKEY, "10", page)  
                .subscribeOn(Schedulers.io())         /* 指定Observable执行所在的线程 */  
                .map(new Func1>() {  
                    @Override  
                    public List call(News news) {  
                        return news.getNewslist();  
                    }  
                })  
                .observeOn(AndroidSchedulers.mainThread())  /* 将后边的线程切换到主线程 */  
                .subscribe(new Subscriber>() {  
                    @Override  
                    public void onCompleted() {  
                        easyRecyclerView.setRefreshing(false);  
                    }  
  
                    @Override  
                    public void onError(Throwable e) {  
                        Snackbar.make(easyRecyclerView, R.string.network_error, Snackbar.LENGTH_LONG).show();  
                    }  
  
                    @Override  
                    public void onNext(List newslistBeen) {  
                        adapter.addAll(newslistBeen);  
                    }  
                });  
        page++;  
  
    }  
复制代码

新闻详情:



瀑布流图片:

同样采用EasyRecyclerView

数据来自Gank.io



大图:

采用Picasso进行图片的加载

Picasso加载全尺寸图片质量高于Glide

Glide优势在于gif图片的加载以及按照ImageView大小加载相应尺寸的图片



图片保存使用RxJava~

代码如下:

private void savePicture(final Context context, final String id) {  
        Observable.create(new Observable.OnSubscribe() {  
            @Override  
            public void call(Subscriber subscriber) {  
                Bitmap bitmap = null;  
                try {  
                    /* Picasso加载图片质量高于Glide */  
                    bitmap = Picasso.with(context).load(bitmapUrl).get();  
                } catch (IOException e) {  
                    subscriber.onError(e);  
                }  
                if (bitmap == null) {  
                    subscriber.onError(new Exception("无法下载图片"));  
                }  
                subscriber.onNext(bitmap);  
                subscriber.onCompleted();  
            }  
        }).subscribeOn(Schedulers.io())  
                .observeOn(AndroidSchedulers.mainThread())  
                .subscribe(new Subscriber() {  
                    @Override  
                    public void onCompleted() {  
  
                    }  
  
                    @Override  
                    public void onError(Throwable e) {  
  
                    }  
  
                    @Override  
                    public void onNext(Bitmap bitmap) {  
                        File appDir = new File(Environment.getExternalStorageDirectory(), "NewsAPP");  
                        String pictureName = id + ".jpg";  
                        File file = new File(appDir, pictureName);  
                        try {  
                            FileOutputStream outputStream = new FileOutputStream(file);  
                            /* 断言,true则继续执行,false则java.lang.AssertionError */  
                            assert (bitmap != null);  
                            /** 
                             * 压缩图片 
                             * @param quality 压缩率  100 表示不压缩 
                             */  
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);  
                            outputStream.flush();  
                            outputStream.close();  
                        } catch (IOException e) {  
                            e.printStackTrace();  
                        }  
                        /* 通知图库更新 */  
                        Uri uri = Uri.fromFile(file);  
                        context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));  
                        Toast.makeText(context, "图片已保存至" + appDir.getAbsolutePath() + "文件夹", Toast.LENGTH_SHORT).show();  
                    }  
                });  
  
    }  
复制代码
对了!记得添加网络访问和存储器写权限!

分类:
Android
分类:
Android
收藏成功!
已添加到「」, 点击更改