先贴出代码地址吧: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();
}
});
}
对了!记得添加网络访问和存储器写权限!