Android 开发技术选型(博客,新闻,阅读类)
前言
最开始学习写应用的时候,发现类聚合数据这个平台可以提供一些免费数据接口,于是写了个人的第一个应用—– JuheNews,当时的知识储备稍显粗糙,虽然现在的知识也不咋滴,但是相对之前而言还是有些进步的,所以决定将应用重构一下,具体参考我的第二个个人开发的应用— GankIOClient,采用类似的技术思路,重构后两个应用在代码结构上是很相似的。
技术选型
1. 下拉刷新 + 加载更多
采用BGARefreshLayout-Android,支持的下拉刷新样式基本可以满足我的需求,使用起来也比较简单,实现两个接口即可设置刷新动作和加载更多的动作。这位卓友的其他开源库也很好用,有兴趣的可以去看下。
使用方法:
private void initBGALayout() {
// 为BGARefreshLayout 设置代理
bgaRefreshLayout.setDelegate(this);
// 设置下拉刷新和上拉加载更多的风格 参数1:应用程序上下文,参数2:是否具有上拉加载更多功能
BGANormalRefreshViewHolder refreshViewHolder =
new BGANormalRefreshViewHolder(getContext(), true);
refreshViewHolder.setLoadingMoreText("加载更多");
refreshViewHolder.setLoadMoreBackgroundColorRes(R.color.white);
refreshViewHolder.setRefreshViewBackgroundColorRes(R.color.white);
bgaRefreshLayout.setRefreshViewHolder(refreshViewHolder);
}
@Override
public void onBGARefreshLayoutBeginRefreshing(BGARefreshLayout refreshLayout) {
//执行下拉刷新操作
}
@Override
public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) {
//执行加载更多操作,返回false代表不支持加载更多
return false;
}
2. 网络请求
Retrofit + RxJava2,这个就不用多做介绍了,最开始学习这两个内容的时候读过的文章分享一下:
RxJava 与 Retrofit 结合的最佳实践
给 Android 开发者的 RxJava 详解
我的一个RxJava2文章收藏集
这位朋友写的通俗易懂,不看Rxjava2的官文应该也能很快的了解Rxjava升级到2之后的变化。
使用方法:
public interface JuheApi {
@GET
Observable<NewsBean> getNews(@Url String url);
@GET
Observable<FunnyBean> getFunny(@Url String url);
@GET
Observable<JokeBean> getJoke(@Url String url);
@GET
Observable<HistoryBean> getTodayInHistory(@Url String url);
@GET
Observable<QueryNewsBean> getQueryNews(@Url String url);
}
public class Retrofitance {
public static final String BASE_URL = "http://gank.io/api/";
private static final int DEFAULT_TIMEOUT = 5;
private Retrofit retrofit;
private JuheApi mJuheApi;
private OkHttpClient mOkHttpClient;
//构造方法私有
private Retrofitance() {
//手动创建一个OkHttpClient并设置超时时间
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
mOkHttpClient = httpClientBuilder.build();
retrofit = new Retrofit.Builder().client(mOkHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
mJuheApi = retrofit.create(JuheApi.class);
}
//获取单例
public static Retrofitance getInstance() {
return SingletonHolder.INSTANCE;
}
/**
* 根据类型获取新闻信息
*/
public void getNews(Observer<NewsBean> subscriber, String type) {
String URL = "";
commonOp(mJuheApi.getNews(URL),subscriber);
}
/**
* 获取趣图信息
*/
public void getFunny(Observer<FunnyBean> subscriber, int pagenum) {
String URL ="";
commonOp(mJuheApi.getFunny(URL), subscriber);
}
/**
* 获取历史上的今天
*/
public void getHistory(Observer<HistoryBean> subscriber) {
Calendar now = Calendar.getInstance();
String URL = "";
commonOp(mJuheApi.getTodayInHistory(URL),subscriber);
}
/**
* 获取笑话大全
*/
public void getJoke(Observer<JokeBean> subscriber, int pagenum) {
String URL ="";
commonOp(mJuheApi.getJoke(URL), subscriber);
}
public void getQueryNews(Observer<QueryNewsBean> subscriber, String keyword) {
String URL = "";
commonOp(mJuheApi.getQueryNews(URL), subscriber);
}
private void commonOp(Observable observable, Observer subscriber) {
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
//在访问HttpMethods时创建单例
private static class SingletonHolder {
private static final Retrofitance INSTANCE = new Retrofitance();
}
}
3. 响应式编程
不二选择,RxJava2 + RxAndoid,告别Thread和AsyncTask,不用写Handler了。
使用方法:
public void getContent(int pagenum) {
Observer<FunnyBean> observer = new Observer<FunnyBean>() {
@Override
public void onComplete() {
endLoading();
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
endLoading();
onNetworkError();
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(FunnyBean funnyBean) {
if (bgaRefreshLayout.isLoadingMore()) {
} else {
mVisitableList.clear();
}
if (funnyBean.getResult() == null || funnyBean.getResult().getData() == null
|| funnyBean.getResult().getData().size() == 0) {
onDataEmpty();
} else {
mVisitableList.addAll(funnyBean.getResult().getData());
}
mMultiRecyclerAdapter.setData(mVisitableList);
}
};
Retrofitance.getInstance().getFunny(observer, pagenum);
}
4. 多类型RecyclerView Item实现
参考博文RecyclerView多类型Item的正确实现姿势
当然你也可以选择一些开源库,只是我习惯了使用这种方式,用起来也比较顺手。思路和实现方式也比较简单,使用接口化的数据和泛型,抽取抽象类,结构分明,扩展性强,聪明的你应该一看就会懂。
具体使用方法参考项目代码或者是上面这篇博文,涉及的代码比较多,主要是稍微有点结构化,不便列举。
5. 注解
butterknife,告别findViewById,但是有了Kotlin,我觉得我们也可以告别butterknife了,毕竟一把小刀。
使用方法:
@BindView(R.id.tl_web)
Toolbar tlWeb;
@BindView(R.id.wv_content)
WebView wvContent;
@BindView(R.id.activity_web)
LinearLayout activityWeb;
@BindView(R.id.progressbar)
ProgressBar progressbar;
....
ButterKnife.bind(this);
配合插件使用效果会更好喔。
6. 图片加载
我首选Glide,因为我有GIF的需求,Picasso不支持GIF,虽然体量比较小。
Glide的使用方法参考官文,最近Glide有大版本升级,改动比较多,有兴趣的可以关注下
使用方法:
Glide.with(itemView.getContext()).load(pic1path).placeholder(R.mipmap.empty_data).into(imageView);
Glide有更高阶的使用方法,根据需求学习吧。
7. 数据解析
Gson,Google的开源库,基本可以满足我的开发需求,暂时没有尝试过其他的。
使用的过程中配合Retrofit使用
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
retrofit = new Retrofit.Builder().client(mOkHttpClient)
/*This is the key*/
.addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(BASE_URL)
.build();
配合插件使用效果会更好:GsonFormat
8. 界面布局
采用TabHost + Framgnet可以满足日常需求,当然使用开源库FlycoTabLayout更是可以构建出炫酷的Tab页面,配合上Fragment,基本可以满足需求。
使用方法:
switch (i) {
case 0:
textView.setText("资讯");
imageView.setImageResource(R.drawable.news);
tabHost.addTab(tabHost.newTabSpec("1").setIndicator(view).setContent(
R.id.frag_news));
break;
case 1:
textView.setText("笑话");
imageView.setImageResource(R.drawable.joke);
tabHost.addTab(tabHost.newTabSpec("2").setIndicator(view).setContent(
R.id.frag_joke));
break;
case 2:
textView.setText("趣图");
imageView.setImageResource(R.drawable.funny);
tabHost.addTab(tabHost.newTabSpec("3").setIndicator(view).setContent(
R.id.frag_funny));
break;
case 3:
textView.setText("历史");
imageView.setImageResource(R.drawable.history);
tabHost.addTab(tabHost.newTabSpec("4").setIndicator(view).setContent(
R.id.frag_history));
break;
default:
break;
}
FlycoTabLayout的使用方法参考官文或者网上如海水般的博文。
9. 内容搜索
自定义Toolbar这个时候就显示出来威力。简单的一个文本框和一个若隐若现的搜索按钮,满足需求。开源库也有一些,但是适合我自己的不太多,所以基本上我都是如上实现。
使用方法:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_search"
android:layout_width="match_parent"
android:layout_height="40dp"
android:fitsSystemWindows="true"
android:background="@color/colorToolbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/et_search"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:layout_weight="6"
android:background="@drawable/search_edittext_bg"
android:padding="2dp"
android:textColor="@color/colorBlack"
android:textSize="12sp"/>
<Button
android:id="@+id/bt_search"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:clickable="false"
android:gravity="center"
android:text="搜索"
android:background="@color/colorToolbar"
android:textColor="@color/colorToolbar"
android:textSize="14sp"/>
</LinearLayout>
</android.support.v7.widget.Toolbar>
10. 版本更新
第三方服务 。我使用的是Fir.im,相对比较好用,利用提供的版本接口检测版本更新。然后本地下载或者跳转到浏览器下载应用,完成安装,都是不错的选择。类似的平台还有很多,可以网上搜索一下。
Android 开发技术选型(博客,新闻,阅读类)的更多相关文章
- android开发进阶学习博客资源
Android开发者博客推荐 Android入门级 - 罗宪明 http://blog.csdn.net/wdaming1986 Android入门级 - 魏祝林 http://blog.csdn.n ...
- [Android开发系列]IT博客应用
1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...
- 完整Android开发基础入门博客专栏
博客地址:http://www.runoob.com/w3cnote/android-tutorial-contents.html
- [Android开发系列]IT博客应用V1.3
首先,感谢使用这款软件并给我意见的朋友们,有你们的意见,才有了这个版本. 其次,检索功能和分类筛选功能(如果是你提的意见,记得在下面mark哦,毕竟读代码你能发现,其实发意见这个就是用自己的邮箱给自己 ...
- 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- 一步步开发自己的博客 .NET版(3、注册登录功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
随机推荐
- 20145328 《Java程序设计》第6周学习总结
20145328 <Java程序设计>第6周学习总结 教材学习内容总结 输入/输出 InputStream与OutputStream 从应用程序角度来看,如果要将数据从来源取出,可以使用输 ...
- win10下搭建jz2440v3(arm s3c2440)开发及gdb调试环境【转】
本文转载自:https://blog.csdn.net/newjay03/article/details/72835758 本来打算完全在Ubuntu下开发的,但是水平有限,没有在Ubuntu下找到合 ...
- eclipse 工程没有build path
项目的.project文件添加: <buildSpec><buildCommand><name>org.eclipse.jdt.core.javabuilder&l ...
- HA-web-services
一.HA部署 本次实验的程序选型为heartbeat v1 + hearesources.资源有IP和httpd,filesystem 配置HA集群的前提: (1)各节点资源一致,硬件或软件环境一致 ...
- springMVC多视图的支持
1.在springmvc.xml中加上 <!-- 多视图的支持 --> <bean class="org.springframework.web.servlet.view. ...
- webservice的cxf的客户端
1.新建一个java项目 2.用cmd命令生成客户端的使用说明文档 wsdl2java -p xiaostudy -d . http://127.0.0.1:9998/number?wsdl 3.导入 ...
- 数据结构实习 Problem H 迷宫的最短路径
数据结构实习 Problem H 迷宫的最短路径 题目描述 设计一个算法找一条从迷宫入口到出口的最短路径. 输入 迷宫的行和列m n 迷宫的布局 输出 最短路径 样例输入 6 8 0 1 1 1 0 ...
- 酷到没朋友—— Cafflano便携式手磨手冲一体壶
又一款外国新玩具~ 设计紧凑,手磨.滤架.滤壶融合的毫无ps痕迹! 简直是出差旅行,杀人越货必备良品!废话不多说,上图: 肿么样,一壶在手,天下我有~~~哈哈哈~~~
- Class.forName()与newInstance()
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sq ...
- BZOJ4787/UOJ290 【ZJOI2017】仙人掌
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...