欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android初学者必须知道的10个技术

程序员文章站 2022-03-22 23:33:09
如果你是往android开发路上走,那么以下的10个技术功能实现是你必须要会的,来看看。 技术选型 1. 下拉刷新 + 加载更多 采用bgarefreshlayout...

如果你是往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);

配合插件使用效果会更好喔。

Android初学者必须知道的10个技术

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

Android初学者必须知道的10个技术

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,相对比较好用,利用提供的版本接口检测版本更新。然后本地下载或者跳转到浏览器下载应用,完成安装,都是不错的选择。类似的平台还有很多,可以网上搜索一下。