新手学习Rotrofit+RxJava网络请求以及Material Design风格

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


近期,宣讲会也不多了,受 饿了么 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<News, List<News.NewslistBean>>() {
                    @Override
                    public List<News.NewslistBean> call(News news) {
                        return news.getNewslist();
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())  /* 将后边的线程切换到主线程 */
                .subscribe(new Subscriber<List<News.NewslistBean>>() {
                    @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<News.NewslistBean> 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<Bitmap>() {
            @Override
            public void call(Subscriber<? super Bitmap> 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<Bitmap>() {
                    @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();
                    }
                });

    }

对了!记得添加网络访问和存储器写权限!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值