zoukankan      html  css  js  c++  java
  • 项目中用到的那些方便流行的库-强烈推荐

    简介

    • 本文主要对我们项目中的使用过的一些库流行库做些介绍,后期再对其中的一些库,如RxJava,RxAndroid,retrofit ,androidannotations,react-native,做细节的分析,到时候再附上使用的demo。

    • 本文中提到的库,都是目前流行的,而且使用量比较大,是非常好用的库,强烈推荐~

    Rx系列

    • ReactiveX是ReactiveExtensions的缩写,简写为Rx,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便的处理异步数据流,Rx库支持 .NET、JavaScript和C++,java,RxJava就是对java语言的支持。

    RxJava:

    • 观察者模式、响应式编程、函数式风格、简化代码,更轻松的使用并发,开发必备神器~~~

    • github源码

    • 官方文档
    • Rxjava文档中文版
    • rxjava使用
    • Awesome-RxJava :关于rxjava相关内容集锦
    • 给 Android 开发者的 RxJava 详解
    • rxjava相关

    • android studio中引入,build.grade的dependencies中引用举例:

    • 1 dependencies {
      2       compile 'io.reactivex:rxjava:1.0.y-SNAPSHOT'
      3   }

      RxAndroid:

      • 在RxJava的基础上扩展了一些Android的功能
      • 除了下面提到的RxBinding,RxLifecycle,还有很多别的扩展库,有兴趣的小伙伴可以自己看看, wiki 里面都有
      • github源码
      • wiki :里面介绍了很多其他Android的基于rx的库
      • 使用demo
      • 简单示例:

      •  1 Observable.create(new Observable.OnSubscribe<ArrayList<MyItem>>() {
         2 
         3               @Override
         4               public void call(Subscriber<? super ArrayList<MyItem>> subscriber) {
         5                   //一般为耗时操作,网络获取数据或者读取数据库等
         6                   ArrayList<MyItem> localData = MyDbManager.getDbDatas();
         7                   subscriber.onNext(localData); //数据获取之后,返回获取的数据
         8                   subscriber.onCompleted();
         9               }
        10           })
        11                   .subscribeOn(Schedulers.io()) //获取数据在io线程中
        12                   .observeOn(AndroidSchedulers.mainThread()) //得到数据之后,在主线程更新界面和数据
        13                   .subscribe(new Observer<ArrayList<MyItem>>() {
        14                       @Override
        15                       public void onCompleted() {
        16 
        17                       }
        18 
        19                       @Override
        20                       public void onError(Throwable e) {
        21 
        22                       }
        23 
        24                       @Override
        25                       public void onNext(ArrayList<MyItem> items) {
        26                           //得到数据,do something
        27                       }
        28                   });

        RxBinding:

        • Android控件的事件绑定,处理控件的异步调用,使用非常方便
        • github源码
        • 简单示例:
        • //防止多击,500ms内算一次点击
            RxView.clicks(view)
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        //点击事件处理
                    }
                });

          RxLifecycle:

          • 绑定生命,例如,使用Retrofit请求网络的时候,可以直接绑定生命周期,在界面退出时,取消请求。
          • github源码
          • 简单示例
          • 1 //伪代码
            2   Observable.compose(this.<MyData>bindToLifecycle()) //activity中
            3   Observable..compose(this.<MyData>bindUntilEvent(FragmentEvent.DETACH)) //Fragment中

            网络系列

            网络请求比较流行的几个开源库,我们项目中基本都用上了,此处做一些简单介绍。个人最喜欢retrofit,结合Rxjava,RxAndroid简直完美~

            okhttp:

            retrofit:

            • Retrofit与okhttp共同出自于 Square ,retrofit对okhttp做了一层封装,真正的网络请求,默认使用的是okhttp。结合RxJava,RxAndroid,代码清晰明了.
            • github源码
            • 官网
            • wiki

            volley:

            • 2013年Google I/O大会上推出了一个网络通信框架—— Volley.
            • 公司有一个项目中用的是这个网络请求框架,不过发现一个bug,退出activity时取消网络请求,下次进入,可能会出现本次请求没有走success和failure的回调,是因为之前的cancel引起的bug,不知道现在有没有解决这个bug.
            • 源码
            • 下载源码:
            • 1 git clone https://android.googlesource.com/platform/frameworks/volley

              图片系列

              • 图片加载这块,不管使用哪个库或者自己写,用起来多简单,都建议多一次封装,写个ImageUtils,将所有的图片加载放在这里面,这样以后如果有问题,或者需要替换别的图片库,会方便很多,代码也更易管理。

              Picasso

              • 同样是square门下的,是较轻量级图片缓存库,本身没有做本地缓存,交给了网络库 okhttp 去实现。简单好用~
              • github源码
              • 官网
              • 简单示例
              • 1 Picasso.with(context).load(uri).placeholder(R.drawable.placeholder).into(view);

                glide

                • 不仅支持图片缓存,还支持 Gif、WebP、缩略图、视频。
                • github源码
                • wiki
                • 简单示例
                • 1 Glide.with(context).load(uri).placeholder(R.drawable.placeholder).into(view);

                  fresco

                  其他

                  react-native

                  LeakCanary

                  • 有时候OOM只是表象,更深层次的原因可能是内存泄漏,什么是内存泄漏?直白点说就是该内存空间使用完之后没有被回收,内存泄漏严重会导致内存很快被耗尽,从而导致OOM,最后程序crash~~~
                  • LeakCanary可以检测内存泄漏,让内存泄漏无所遁形。使用后,在debug模式下,如果出现内存泄漏,则会弹出通知,告诉你哪里出现了泄漏,非常好用~
                  • github源码
                  • LeakCanary使用说明
                  • LeakCanary中文使用说明
                  • build.gradle 中加入引用,不同的编译使用不同的引用.目前已经到1.4版本了,具体见 github
                  • 1 dependencies {
                    2       debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
                    3       forTestCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
                    4       releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
                    5   }

                    简单示例:

                  •  1 public class MyApplication extends MultiDexApplication {
                     2 
                     3       private RefWatcher mRefWatcher;
                     4 
                     5       @Override
                     6       public void onCreate() {
                     7           super.onCreate();
                     8            // init memory leak detection
                     9           mRefWatcher = LeakCanary.install(this);
                    10       }
                    11 
                    12       public static RefWatcher getRefWatcher(Context context) {
                    13           MyApplication application = (MyApplication) context.getApplicationContext();
                    14           return application.mRefWatcher;
                    15       }
                    16   }
                    17 
                    18   //监控你想要监控的对象。以此为例:
                    19   public class BaseFragment extends RxFragment {
                    20       @Override
                    21       public void onDestroy() {
                    22           super.onDestroy();
                    23           if (getActivity() != null) {
                    24               RefWatcher refWatcher = ZYApplication.getRefWatcher(getActivity());
                    25               refWatcher.watch(this);
                    26           }
                    27       }
                    28   }

                    EventBus

                    • EventBus用于发布/订阅事件。可以替代Intent,Handler,BroadCast在Activity,Fragment,线程等之间的消息传递.代码简洁优雅,将发送者和接收者解耦。例如:登录功能,登录成功之后发送一个消息,需要刷新或关闭的界面,接受这个消息,做自己想做的事情~
                    • github源码
                    • 简单示例:

                       1 public class AccountEvent {
                       2       private User user;//你想要传递的数据
                       3       public AccountEvent(User user) {
                       4           this.user = user;
                       5       }
                       6 
                       7       public User getUser() {
                       8           return user;
                       9       }
                      10 
                      11       public void setUser(User user) {
                      12           this.user = user;
                      13       }
                      14   }
                      15 
                      16   public class LoginActivity {
                      17       public loginSuccess(User user) {
                      18           EventBus.getDefault().post(new AccountEvent(user));//发消息
                      19       }
                      20   }
                      21 
                      22   public class MyFragment{
                      23       @Override
                      24       public void onCreate(Bundle savedInstanceState) {
                      25           super.onCreate(savedInstanceState);
                      26           EventBus.getDefault().register(this);
                      27       }
                      28 
                      29       @Override
                      30       public void onDestroy() {
                      31           super.onDestroy();
                      32           EventBus.getDefault().unregister(this);
                      33       }
                      34 
                      35       public void onEvent(AccountEvent event) {//接受消息
                      36           //do something 
                      37       }
                      38   }

                      androidannotations

                      • 注解,一方面可以减少代码量,再也不用findViewById了,另一方面,代码清晰明了,优雅的不得了啊,哈哈~
                      • 常用的比较好的注解库有两个,一个是androidannotations,另一个是 butterknife,butterknife很火,是JakeWharton大神的作品,火是必须的~
                      • 但是我们的项目中用的是androidannotations,因为androidannotations不是利用的反射技术,性能相对好点,它是在本地自动生成一个新的类(如你在MyActivity中使用了注解,则它会自动生成一个MyActivity_ 类),真正执行的是它自动生成的这个类,而且在manifest中需要注册的也是此MyActivity_,而不是MyActivity,你也可以打开这个类,看看里面的实现,有bug也比较好解决。
                      • 官网
                      • github源码
                      • wiki :androidannotations的wiki非常详细,有问题的小伙伴们,可以好好地看看这个。
                      • 简单示例

                         1 @EActivity(R.layout.activity_my)
                         2   public class MyActivity extends BaseActivity {
                         3       @StringRes(R.string.my_string)
                         4       String mMyString;
                         5 
                         6       @ViewById(R.id.tv)
                         7       TextView mTV;
                         8 
                         9       @Extra()
                        10       int mCount;
                        11 
                        12       @Pref
                        13       UserPreference_ mUserPreference;
                        14 
                        15       @AfterViews
                        16       void initialize() {
                        17       //初始化数据
                        18       }
                        19 
                        20       @Click(R.id.finish_iv)
                        21       void finish() {
                        22           //do something
                        23       }
                        24 
                        25       public void loginSuccess(){
                        26           mUserPreference.edit().hasLogin().put(true).apply();
                        27       }
                        28   }
                        29 
                        30   @SharedPref(value = SharedPref.Scope.UNIQUE) //作用域:整个应用都可以使用
                        31   public interface UserPreference {
                        32       @DefaultBoolean(false)
                        33       boolean hasLogin();
                        34   }
    • 来自:http://www.jianshu.com/p/6db1a5e84d67
  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/huolongluo/p/6094782.html
Copyright © 2011-2022 走看看