温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-09-06 16:59:05 来源:脚本之家 阅读:147 作者:laozhang 栏目:移动开发

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI