Android初學者必須知道的10個技術(shù)
如果你是往Android開發(fā)路上走,那么以下的10個技術(shù)功能實現(xiàn)是你必須要會的,來看看。
技術(shù)選型
1. 下拉刷新 + 加載更多
采用BGARefreshLayout-Android,支持的下拉刷新樣式基本可以滿足我的需求,使用起來也比較簡單,實現(xiàn)兩個接口即可設(shè)置刷新動作和加載更多的動作。這位卓友的其他開源庫也很好用,有興趣的可以去看下。
使用方法:
private void initBGALayout() {
// 為BGARefreshLayout 設(shè)置代理
bgaRefreshLayout.setDelegate(this);
// 設(shè)置下拉刷新和上拉加載更多的風格 參數(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ò)請求
使用方法:
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;
//構(gòu)造方法私有
private Retrofitance() {
//手動創(chuàng)建一個OkHttpClient并設(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(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時創(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) {
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實現(xiàn)
當然你也可以選擇一些開源庫,只是我習慣了使用這種方式,用起來也比較順手。思路和實現(xiàn)方式也比較簡單,使用接口化的數(shù)據(jù)和泛型,抽取抽象類,結(jié)構(gòu)分明,擴展性強,聰明的你應(yīng)該一看就會懂。
具體使用方法參考項目代碼或者是上面這篇博文,涉及的代碼比較多,主要是稍微有點結(jié)構(gòu)化,不便列舉。
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有大版本升級,改動比較多,有興趣的可以關(guān)注下
使用方法:
Glide.with(itemView.getContext()).load(pic1path).placeholder(R.mipmap.empty_data).into(imageView);
Glide有更高階的使用方法,根據(jù)需求學習吧。
7. 數(shù)據(jù)解析
Gson,Google的開源庫,基本可以滿足我的開發(fā)需求,暫時沒有嘗試過其他的。
使用的過程中配合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更是可以構(gòu)建出炫酷的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的使用方法參考官文或者網(wǎng)上如海水般的博文。
9. 內(nèi)容搜索
自定義Toolbar這個時候就顯示出來威力。簡單的一個文本框和一個若隱若現(xiàn)的搜索按鈕,滿足需求。開源庫也有一些,但是適合我自己的不太多,所以基本上我都是如上實現(xiàn)。
使用方法:
<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. 版本更新
第三方服務(wù) 。我使用的是Fir.im,相對比較好用,利用提供的版本接口檢測版本更新。然后本地下載或者跳轉(zhuǎn)到瀏覽器下載應(yīng)用,完成安裝,都是不錯的選擇。類似的平臺還有很多,可以網(wǎng)上搜索一下。
相關(guān)文章
Android onActivityResult和setResult方法詳解及使用
這篇文章主要介紹了Android onActivityResult和setResult方法詳解及使用的相關(guān)資料,這里提供實例,幫助大家學習理解,需要的朋友可以參考下2016-12-12
Android 調(diào)用系統(tǒng)相機拍攝獲取照片的兩種方法實現(xiàn)實例
這篇文章主要介紹了Android 調(diào)用系統(tǒng)相機拍攝獲取照片的兩種方法實現(xiàn)實例的相關(guān)資料,一種是通過Bundle來獲取壓縮過的照片,一種是通過SD卡獲取的原圖,需要的朋友可以參考下2016-11-11
Android 類似UC瀏覽器的效果:向上滑動地址欄隱藏功能
這篇文章主要介紹了Android 類似UC瀏覽器的效果:向上滑動地址欄隱藏功能,需要的朋友可以參考下2017-12-12
關(guān)于gradle你應(yīng)該知道的一些小事
這篇文章主要給大家介紹了關(guān)于gradle你應(yīng)該知道的一些小事,文中通過示例代碼介紹的非常詳細,對大家學習或者使用gradle具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-10-10
Android應(yīng)用隱私合規(guī)檢測實現(xiàn)方案詳解
這篇文章主要介紹了Android應(yīng)用隱私合規(guī)檢測實現(xiàn)方案,我們需要做的就是提前檢測好自己的應(yīng)用是否存在隱私合規(guī)問題,及時整改過來,下面提供Xposed Hook思路去檢測隱私合規(guī)問題,建議有Xposed基礎(chǔ)的童鞋閱讀,需要的朋友可以參考下2022-07-07

