十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
如果你是往Android開發(fā)路上走,那么以下的10個(gè)技術(shù)功能實(shí)現(xiàn)是你必須要會(huì)的,來(lái)看看。
公司主營(yíng)業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出于都免費(fèi)做網(wǎng)站回饋大家。
技術(shù)選型
1. 下拉刷新 + 加載更多
采用BGARefreshLayout-Android,支持的下拉刷新樣式基本可以滿足我的需求,使用起來(lái)也比較簡(jiǎn)單,實(shí)現(xiàn)兩個(gè)接口即可設(shè)置刷新動(dòng)作和加載更多的動(dòng)作。這位卓友的其他開源庫(kù)也很好用,有興趣的可以去看下。
使用方法:
private void initBGALayout() { // 為BGARefreshLayout 設(shè)置代理 bgaRefreshLayout.setDelegate(this); // 設(shè)置下拉刷新和上拉加載更多的風(fēng)格 參數(shù)1:應(yīng)用程序上下文,參數(shù)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) { //執(zhí)行下拉刷新操作 } @Override public boolean onBGARefreshLayoutBeginLoadingMore(BGARefreshLayout refreshLayout) { //執(zhí)行加載更多操作,返回false代表不支持加載更多 return false; }
2. 網(wǎng)絡(luò)請(qǐng)求
使用方法:
public interface JuheApi { @GET ObservablegetNews(@Url String url); @GET Observable getFunny(@Url String url); @GET Observable getJoke(@Url String url); @GET Observable getTodayInHistory(@Url String url); @GET Observable 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; //構(gòu)造方法私有 private Retrofitance() { //手動(dòng)創(chuàng)建一個(gè)OkHttpClient并設(shè)置超時(shí)時(shí)間 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; } /** * 根據(jù)類型獲取新聞信息 */ public void getNews(Observersubscriber, String type) { String URL = ""; commonOp(mJuheApi.getNews(URL),subscriber); } /** * 獲取趣圖信息 */ public void getFunny(Observer subscriber, int pagenum) { String URL =""; commonOp(mJuheApi.getFunny(URL), subscriber); } /** * 獲取歷史上的今天 */ public void getHistory(Observer subscriber) { Calendar now = Calendar.getInstance(); String URL = ""; commonOp(mJuheApi.getTodayInHistory(URL),subscriber); } /** * 獲取笑話大全 */ public void getJoke(Observer subscriber, int pagenum) { String URL =""; commonOp(mJuheApi.getJoke(URL), subscriber); } public void getQueryNews(Observer 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); } //在訪問(wèn)HttpMethods時(shí)創(chuàng)建單例 private static class SingletonHolder { private static final Retrofitance INSTANCE = new Retrofitance(); } }
3. 響應(yīng)式編程
不二選擇,RxJava2 + RxAndoid,告別Thread和AsyncTask,不用寫Handler了。
使用方法:
public void getContent(int pagenum) { Observerobserver = new Observer () { @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實(shí)現(xiàn)
當(dāng)然你也可以選擇一些開源庫(kù),只是我習(xí)慣了使用這種方式,用起來(lái)也比較順手。思路和實(shí)現(xiàn)方式也比較簡(jiǎn)單,使用接口化的數(shù)據(jù)和泛型,抽取抽象類,結(jié)構(gòu)分明,擴(kuò)展性強(qiáng),聰明的你應(yīng)該一看就會(huì)懂。
具體使用方法參考項(xiàng)目代碼或者是上面這篇博文,涉及的代碼比較多,主要是稍微有點(diǎn)結(jié)構(gòu)化,不便列舉。
5. 注解
butterknife,告別findViewById,但是有了Kotlin,我覺(jué)得我們也可以告別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);
配合插件使用效果會(huì)更好喔。
6. 圖片加載
我首選Glide,因?yàn)槲矣蠫IF的需求,Picasso不支持GIF,雖然體量比較小。
Glide的使用方法參考官文,最近Glide有大版本升級(jí),改動(dòng)比較多,有興趣的可以關(guān)注下
使用方法:
Glide.with(itemView.getContext()).load(pic1path).placeholder(R.mipmap.empty_data).into(imageView);
Glide有更高階的使用方法,根據(jù)需求學(xué)習(xí)吧。
7. 數(shù)據(jù)解析
Gson,Google的開源庫(kù),基本可以滿足我的開發(fā)需求,暫時(shí)沒(méi)有嘗試過(guò)其他的。
使用的過(guò)程中配合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();
配合插件使用效果會(huì)更好:GsonFormat
8. 界面布局
采用TabHost + Framgnet可以滿足日常需求,當(dāng)然使用開源庫(kù)FlycoTabLayout更是可以構(gòu)建出炫酷的Tab頁(yè)面,配合上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的使用方法參考官文或者網(wǎng)上如海水般的博文。
9. 內(nèi)容搜索
自定義Toolbar這個(gè)時(shí)候就顯示出來(lái)威力。簡(jiǎn)單的一個(gè)文本框和一個(gè)若隱若現(xiàn)的搜索按鈕,滿足需求。開源庫(kù)也有一些,但是適合我自己的不太多,所以基本上我都是如上實(shí)現(xiàn)。
使用方法:
10. 版本更新
第三方服務(wù) 。我使用的是Fir.im,相對(duì)比較好用,利用提供的版本接口檢測(cè)版本更新。然后本地下載或者跳轉(zhuǎn)到瀏覽器下載應(yīng)用,完成安裝,都是不錯(cuò)的選擇。類似的平臺(tái)還有很多,可以網(wǎng)上搜索一下。