最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android初學者必須知道的10個技術(shù)

 更新時間:2017年12月01日 16:19:09   投稿:laozhang  
本篇內(nèi)容給大家整理10個作為Android初學者必須要了解和會用的技術(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:應用程序上下文,參數(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)絡請求

使用方法:

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. 響應式編程

不二選擇,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)分明,擴展性強,聰明的你應該一看就會懂。

具體使用方法參考項目代碼或者是上面這篇博文,涉及的代碼比較多,主要是稍微有點結(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. 版本更新

第三方服務 。我使用的是Fir.im,相對比較好用,利用提供的版本接口檢測版本更新。然后本地下載或者跳轉(zhuǎn)到瀏覽器下載應用,完成安裝,都是不錯的選擇。類似的平臺還有很多,可以網(wǎng)上搜索一下。

相關(guān)文章

  • 故事講解Activity生命周期(貓的一生)

    故事講解Activity生命周期(貓的一生)

    關(guān)于Android中Activity的生命周期,網(wǎng)上大多數(shù)文章基本都是直接貼圖、翻譯API,比較籠統(tǒng)含糊不清。本文主要用故事講解Activity生命周期。下面跟著小編一起來看下吧
    2017-03-03
  • Android抽屜導航Navigation Drawer實例解析

    Android抽屜導航Navigation Drawer實例解析

    這篇文章主要為大家詳細介紹了Android抽屜導航NavigationDrawer實例,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android虛擬機與類加載機制詳情

    Android虛擬機與類加載機制詳情

    這篇文章主要介紹了Android虛擬機與類加載機制詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • android使用webwiew載入頁面使用示例(Hybrid App開發(fā))

    android使用webwiew載入頁面使用示例(Hybrid App開發(fā))

    Hybrid App 融合 Web App 的原理就是嵌入一個WebView組件,可以在這個組件中載入頁面,相當于內(nèi)嵌的瀏覽器,下面是使用示例
    2014-03-03
  • Android中分析Jetpack?Compose動畫內(nèi)部的實現(xiàn)原理

    Android中分析Jetpack?Compose動畫內(nèi)部的實現(xiàn)原理

    這篇文章主要介紹了Android中分析Jetpack?Compose動畫內(nèi)部的實現(xiàn)原理,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • Android觀察者模式實例分析

    Android觀察者模式實例分析

    這篇文章主要介紹了Android觀察者模式,實例分析了Android觀察者模式的原理與相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • Android系統(tǒng)音量條實例代碼

    Android系統(tǒng)音量條實例代碼

    這篇文章主要介紹了Android系統(tǒng)音量條實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Android傳遞Bitmap對象在兩個Activity之間

    Android傳遞Bitmap對象在兩個Activity之間

    這篇文章主要介紹了Android傳遞Bitmap對象在兩個Activity之間的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android?應用程序的啟動流程示例詳解

    Android?應用程序的啟動流程示例詳解

    這篇文章主要為大家介紹了Android?應用程序的啟動流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android 矢量室內(nèi)地圖開發(fā)實例

    Android 矢量室內(nèi)地圖開發(fā)實例

    這篇文章主要介紹了Android 矢量室內(nèi)地圖開發(fā)實例的相關(guān)資料,這里提供代碼實例,及實現(xiàn)效果圖,矢量室內(nèi)對圖簡單DEMO,需要的朋友可以參考下
    2016-11-11

最新評論

永城市| 台安县| 柳江县| 合川市| 寿阳县| 麟游县| 延庆县| 西充县| 莫力| 韶山市| 沽源县| 定襄县| 通河县| 泊头市| 鸡东县| 南平市| 民县| 湄潭县| 体育| 盐城市| 永修县| 靖宇县| 辽阳县| 青田县| 垣曲县| 行唐县| 榆林市| 洞口县| 兴化市| 陇西县| 英超| 涟源市| 繁昌县| 铁岭县| 岑巩县| 济源市| 景宁| 株洲县| 高碑店市| 林甸县| 安宁市|