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

来源:互联网 发布:想开淘宝店取名字好呢 编辑:程序博客网 时间:2024/05/17 02:25

先贴出代码地址吧: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();                    }                });    }

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

1 0
原创粉丝点击