Android初学者必须知道的10个技术
如果你是往android开发路上走,那么以下的10个技术功能实现是你必须要会的,来看看。
技术选型
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. 网络请求
使用方法:
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实现
当然你也可以选择一些开源库,只是我习惯了使用这种方式,用起来也比较顺手。思路和实现方式也比较简单,使用接口化的数据和泛型,抽取抽象类,结构分明,扩展性强,聪明的你应该一看就会懂。
具体使用方法参考项目代码或者是上面这篇博文,涉及的代码比较多,主要是稍微有点结构化,不便列举。
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,相对比较好用,利用提供的版本接口检测版本更新。然后本地下载或者跳转到浏览器下载应用,完成安装,都是不错的选择。类似的平台还有很多,可以网上搜索一下。