❶ 真的有必要用rxjava吗
RxJava目前项目在用还是很稳定的 目前网络用的是Rxjava+ReTrofit+okHttp这些框架已经很成熟了完全可以引入项目
❷ android app开发中常用到哪些开源框架
1.Framework 7
来自iDangero.us —自版本.0在一年前发布以来,Framework就一直是开发iOS应用程序的最佳选择之一。由于它提供对安卓的支持,如果你先从iOS入手,但随后构建具有类似iOS外观感觉的安卓版本,它也是个不错的选择。功能特性包括:Material Design用户界面、原生滚动、1:1页面动画、自定义DOM库以及XHR缓存和预装入。
3.jQuery Mobile
来自jQuery基金会— 这种成熟的轻量级框架基于jQuery,缺少本文中介绍的大多数程序包具有的许多高级功能,不过它仍拥有一群庞大的忠实用户。虽然它提供了语义标记、渐进式改进、主题化设计和PhoneGap/Cordova支持之类的功能,但是在类似原生系统的功能和性能或者高级用户界面方面乏善可陈。另一方面,它又很简单,这意味着“编写一次,到处运行”是常常可以实现的目标;对于还需要在Windows Phone和黑莓上运行的简单应用程序而言,它也是个不错的选择。
2.Ionic
来自Ionic — 这种流行的跨平台框架基于Sass CSS扩展语言,使用起来相当容易,不过它还能集成用于构建更高级应用程序的Angularjs。Ionic提供了一个丰富的库,包括针对移动设备优化的HTML、CSS和JS CSS组件、手势及工具,可与预定义的组件协同工作。命令行接口提供了仿真器、实时重装和日志等功能。还有一个基于Cordova的应用程序包装器。
4.Kendo UI
来自Telerik — 这种基于jQuery的HTML5/Java框架既有开源版,又有商业版。对企业用户友好的Kendo UI提供了种类丰富的用户界面窗口组件和插件。它最广为人知的地方就是拥有无数具有Material Design风格的预构建主题,另外还有一个主题构建器,可用于构建自定义主题。其他功能特性包括:Angular和Bootstrap UI集成以及性能优化。
6.Native
来自Telerik —顾名思义,Native专注于原生用户体验开发,但是它提供了跨安卓和iOS的跨平台代码共享支持。该软件使用现有的原生用户界面库,用户界面由Java、XML或视情况而定的Angular来描述。然而,使用起来,它不如Telerik更传统的跨平台Kendo UI框架来得容易。
5.Mobile Angular UI
来自Maurizio Casimirri —这个开源项目将AngularJS和经过修改的推特Bootstrap合并到了一个移动用户界面框架。据说它保留了Bootstrap 3的大部分语法,因而更容易实现从Web应用程序向移动应用程序的移植,同时增添了Bootstrap缺失的许多组件,比如切开关、覆盖、侧边栏、可滚动区域以及固定位置的导航条。库包括fastclick.js和overthrow.js。
7.Onsen UI
来自Asial Corp. — Onsen基于HTML和CSS而建,旨在与并非预先集成的PhoneGap和Cordova协同运行。它还可以与Angular和jQuery协同运行。顾名思义,该程序强调用户界面开发,并提供了一系列广泛的基于Web的用户界面组件和特性,比如表格的双列视图。(然而,仍然缺少Material Design。)这个文档完备的程序针对这样的jQuery Mobile用户:既需要易于使用,又想要更多的功能、更高的性能和更丰富的用户界面特性。总部位于东京的Asial正在开发一种拖放式GUI工具,该公司还开发和维护Monaca。
9.Sencha Touch
来自Sencha — Sencha的成熟的、面向企业的HTML5/Java框架既有开源版,又有商业版。Sencha建立于ExtJS的基础上,能够获得类似原生的性能。它为HTML5提供了可视化应用程序构建器,另外还提供了重复使用自定义组件的功能。原生包装器简化了分发到Google Play等应用程序商店的工作。
8.React Native
来自Facebook — React Native是一种开源框架,从Facebook的React Java框架派生而来,众所周知,Java框架取代了早些时候的HTML5基础。顾名思义,这个面向iOS的高端程序与其说是一种跨平台框架,还不如说是原生程序包装器,但是由于新增了对安卓的支持,它很适合我们的要求,因为你实际上只要用Java编写一次代码,就能移植到这两个平台。目前,只有OS X桌面得到全面支持,不过也有试验性的Linux和Windows版本面向安卓开发。
10.Titanium
来自Appcelerator —不像那些比较偏向Web的框架,Titanium使用Java来构建原生代码,声称有望提升性能。这种基于Node.js的软件开发工具包(SDK)为iOS、安卓、Windows、黑莓和HTML5提供了5000多个API。Titanium更广为人知的地方是性能和丰富的功能特性,而不是易用性。软件是开源,不过只要你不发布你的应用程序,功能齐全的免费版可以免费享用,眼下你每月至少得支付39美元。
❸ rxjava zip和merge的区别
跟自merge的区别是:
1.方法的参数不一样,zip有一个合并函数,merge没有,所以zip发射数据是合并函数的返回值,merge则是交错排列多个源Observable发射的数据。
2.merge的终止不会受任何一个Observable的发射完成而终止,zip则只要有一个Observable的发射完成而终止发射
(merge和zip中只要有一个错误通知终止,就都终止)
❹ android rxjava retrofit 怎么设置本地缓存
android:layout_width="142dp" android:layout_height="36dp" 修改imagebutton上面两个属性就可以了
❺ android开发一般都使用什么框架
Android开发框架介绍
编辑文档
学分 +2
开发框架方面包含基本的应用功能开发、数据存储、网络访问这三大块:
一、应用方面
一般而言一个标准的Android程序由如下4部分组成即Activity、Broadcast Intent Receiver、Service、Content Provider: 1. Activity是最频繁、最基本的模块,在Android中,一个Activity就是手机上一屏,相当于一个网页一样,所不同的是,每个Activity运行结束了,有个返回值,类似一个函数一样。Android系统会自动记录从首页到其他页面的所有跳转记录并且自动将以前的Activity压入系统堆栈,用户可以通过编程的方式删除历史堆栈中的Activity Instance。
Activity类中主要是跟界面资源文件关联起来(res/layout目录下的xml资源,也可以不含任何界面资源),内部包含控件的显示设计、界面交互设计、事件的响应设计以及数据处理设计、导航设计等application设计的方方面面。 2. Broadcast Intent Receiver
Intent提供了各种不同Activity进行跳转的机制,譬如如果从A activity跳转到B activity,使用Intent来实现如下: Intent in = new Intent(A.this, B.class); startActivity(in);
BroadcastReceiver提供了各种不同的Android应用程序进行进行进程间通讯的机制,譬如当电话呼叫来临时,可以通过BroadcastReceiver发布广播消息。对于用户而言,BroadcastReceiver是不透明的,用户无法看到这个事件,BroadcastReceiver通过NotificationManager来通知用户这些事件发生了,它既可以在资源AndroidManifest.xml中注册,也可以在代码中通过Context.registerReceiver()进行注册,只要是注册了,当事件来临的时候,即时程序没有启动,系统也在需要的时候会自动启动此应用程序;另外各应用程序很方便地通过Context.sendBroadcast()将自己的事情广播给其他应用程序;
3. Service,跟Windows当中的Service完全是一个概念,用户可以通过startService(Intent service)启动一个Service,也可通过Context.bindService来绑定一个Service.
4. Content Provider,由于Android应用程序内部的数据都是私有的,Content Provider提供了应用程序之间数据交换的机制,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据暴露出去,并且隐蔽了具体的数据存储实现,标准的ContentProvider提供了基本的CRUD(Create,Read,Update,Delete)的接口,并且实现了权限机制,保护了数据交互的安全性; 一个标准的Android应用程序的工程文件包含如下几大部分: -> Java源代码部分(包含Activity),都在src目录当中;
-> R.java文件,这个文件是Eclipse自动生成与维护的,开发者不需要修改,提供了Android对的资源全局索引; -> Android Library,这个是应用运行的Android库;
-> assets目录,这个目录里面主要用与放置多媒体等一些文件;
-> res目录,放置的是资源文件,跟VC中的资源目录基本类似,其中的drawable包含的是图片文件,layout里面包含的是布局文件,values目录里面主要包含的是字符串(strings.xml)、颜色(colors.xml)以及数组(arrays.xml)资源;
-> AndroidManifest.xml,这个文件异常重要,是整个应用的配置文件,在这个文件中,需要声明所有用到的Activity、Service、Receiver等。
❻ 重识OkHttp——更深入了解如何使用
OkHttp作为square公司出品的一个网络请求框架,应该算是目前Android端最火爆的网络框架了。我公司目前的项目中采用的都是Rxjava结合Retrofit进行网络请求的处理,对于底层真正实现网络请求的OkHttp关注的不是很多。最近探究了一下OkHttp的源码,对OkHttp的使用有了一些新的认识,在此做一下总结。
OkHttp作为当前Android端最火热的网络请求框架,必然有很多的优点。
对于客户端来讲,我们关注的就是把正确的请求发送到服务端并拿到结果来进行处理。在OkHttp中,我认为可以分为3个部分:
OkHttp中通过建造者模式来构建OkHttpClient、Request和Response。对于客户端来讲,我们不需要过多关注Response是如何构建的,因为这个是OkHttp对响应结果进行了封装处理。我们只关注请求Request和客户端OkHttpClient如何构建即可。
Request采用建造者模式来配置url,请求方法method、header、tag和cacheControl。
OkHttp采用POST方法向服务器发送一个请求体,在OkHttp中这个请求体是RequestBody。这个请求体可以是:
RequestBody有几个静态方法用于创建不同类型的请求体:
最终都是相当于重写了RequestBody的两个抽象方法来写入流,如果传递流类型的参数,只要重写这两个抽象方法即可。
例如,我们提交一个String:
提交File:
提交流:
对于提交表单和分块请求,OkHttp提供了两个RequestBody的子类, FormBody 和 MultipartBody
FormBody也是采用建造者模式, 这个很简单,添加key-value形式的键值对即可。
添加键值对有两个方法:
例如:
MultipartBody也是采用建造者模式,MultipartBody.Builder可以构建兼容Html文件上传表单的复杂请求体。每一部分的多块请求体都是它自身的请求体,并且可以定义它自己的请求头。如果存在的话,这些请求头用来描述这部分的请求体。例如Content-Disposition、Content-Length 和 Content-Type如果可用就会被自动添加到头。
MIME类型有:
有几个主要的方法:
例如提交一个图片文件:
OkHttpClient采用建造者模式,通过Builder可以配置连接超时时间、读写时间,是否缓存、是否重连,还可以设置各种拦截器interceptor等。
建议在一个App中,OkHttpClient保持一个实例。一个OkHttpClient支持一定数量的并发,请求同一个主机最大并发是5,所有的并发最大是64。这个与OkHttp中的调度器Dispatcher有关,可以设置并发数。本文不对Dispatcher进行讨论。
一个例子:
OkHttpClient支持单独配置,例如原来设置不同的请求时间,可以通过OkHttpClient的newBuilder()方法来重新构造一个OkHttpClient。例如:
上面已经讲了如何创建Request和OkHttpClient,剩下的就是发送请求并得到服务器的响应了。OkHttp发送请求可分为同步和异步。OkHttpClient首先通过Request构建一个Call,通过这个Call去执行同步或者异步请求。
同步方式,调用Call的execute()方法,返回Response,会阻塞当前线程:
异步方式,调用Call的enqueue(CallBack callBack)方法,会在另一个线程中返回结果。
为了缓存响应,需要一个可读写并且设置大小Size的缓存目录。缓存目录需要私有,其它不信任的应用不能访问这个文件。
如果同时有多个缓存访问同一个缓存目录会报错。所以最好只在App中初始化一次OkHttpClient,给这个实例配置缓存,在整个App生命周期内都用这一个缓存。否则几个缓存会相互影响,导致缓存出错,引起程序崩溃。
响应缓存采用Http头来配置,你可以添加这样的请求头 Cache-Control: max-stale=3600 。 max-age 指的是客户端可以接收生存期不大于指定时间(以 秒 为单位)的响应。
为了防止响应使用缓存,可以用 CacheControl.FORCE_NETWORK 。为了防止使用网络,采用 CacheControl.FORCE_CACHE 。
调用Call.cancel()方法可以立即取消一个网络请求。如果当前线程正在写request或者读response会报IO异常。如果不再需要网络请求,采用这种方法是比较方便的。例如在App中返回了上一页。无论是同步还是异步的请求都可以被取消。
可以通过Response的code来判断请求是否成功,如果服务器返回的有数据,可以通过Response的body得到一个ResponseBody读取。
如果采用ResponseBody的string()方法会一次性把数据读取到内存中,如果数据超过1MB可能会报内存溢出,所以对于超过1MB的数据,建议采用流的方式去读取,如ResponseBody的byteStream()方法。
需要说明的是:
OkHttp中的很多类都用到了建造者模式,可以根据需要灵活配置。采用建造者模式的有:
如果单独使用OkHttp进行网络请求,通常需要开发者自己再封装一下,如果不想重复造轮子,Github上面的有一些优秀开源库可以拿来使用(本文只列出star较多的几个):
OkHttp官方Wiki文档
❼ retrofit怎么本地缓存数据
首先是抽象的基类
public abstract class BaseApi {
public static final String API_SERVER = "服务器地址"
private static final OkHttpClient mOkHttpClient = new OkHttpClient();
private static Retrofit mRetrofit;
protected static Retrofit getRetrofit() {
if (Retrofit == null) {
Context context = Application.getInstance().getApplicationContext();
//设定30秒超时
mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
//设置拦截器,以用于自定义的设置
mOkHttpClient.networkInterceptors()
.add(new CookiesInterceptor(context));
//设置缓存目录
File cacheDirectory = new File(context.getCacheDir()
.getAbsolutePath(), "HttpCache");
Cache cache = new Cache(cacheDirectory, 20 * 1024 * 1024);
mOkHttpClient.setCache(cache);
//构建Retrofit
mRetrofit = new Retrofit.Builder()
//配置服务器路径
.baseUrl(API_SERVER + "/")
//设置日期解析格式,这样可以直接解析Date类型
.setDateFormat("-MM-dd HH:mm:ss")
//配置转化库,默认是Gson
.addConverterFactory(ResponseConverterFactory.create())
//配置回调库,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//设置OKHttpClient为网络客户端
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}
然后是Cookies拦截器
public class CookiesInterceptor implements Interceptor{
private Context context;
public CookiesInterceptor(Context context) {
this.context = context;
}
//重写拦截方法,处理自定义的Cookies信息
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request compressedRequest = request.newBuilder()
.header("cookie", CookieUtil.getCookies(context))
.build();
Response response = chain.proceed(compressedRequest);
CookieUtil.saveCookies(response.headers(), context);
return response;
}
}123456789101112131415161718
CookieUtil则是一些自定义解析和生成方法以及SharedPreferences的存取,代码略
然后是Api类
public class UserApi extends BaseApi{
//定义接口
private interface UserService {
//GET注解不可用@FormUrlEncoded,要用@Query注解引入请求参数
@GET("user/user_queryProfile")
Observable<UserProfileResp> queryProfile(@Query("userId") int userId);
//POST方法没有缓存,适用于更新数据
@FormUrlEncoded
@POST("user/user_updateUserName")
Observable<BaseResp> updateUserName(@Field("userName") String userName);
}
protected static final UserService service = getRetrofit().create(UserService.class);
//查询用户信息接口
public static Observable<UserProfileResp> queryProfile(int userId){
return service.queryProfile(userId);
}
//更新用户名接口
public static Observable<BaseResp> updateUserName(String userName){
return service.updateUserName(userName);
}
}
再就是将Retrofit的响应消息经过Gson解析成期望的数据结构,称之为Model类
上文的BaseResp和UserProfileResp则是自定义的Model
假定服务器约定返回的Json格式为
{
"result":"结果代号,0表示成功",
"msg":"异常信息,仅在失败时返回数据",
"userInfo":
{
"id":"用户id",
"userName":"用户名名字"
}
}123456789
那么UserProfileResp可以写成
public class UserProfileResp {
//@SerializedName是指定Json格式中的Key名
//可以不写,则默认采用与变量名一样的Key名
@SerializedName("userInfo")
private UserProfileModel userInfo;
public UserProfileModel getUserInfo() {
return userInfo;
}
}12345678910
UserProfileModel则是具体的数据结构
public class UserProfileModel {
private int userId;
private String userName;
public String getUserName(){
return userName;
}
}12345678
需要注意的是,如果没有使用@SerializedName指定Key名,当工程被混淆时,变量名会被混淆得与期望的Key名不符。因此需要将这类Model类统一放到一个工程目录,再在proguard-project文件中加入排除项
//不混淆Model类
-keep class com.xxx.model.xxx.** { *; }12
最后是实际调用
public void getProfile(int userId){
UserApi.queryProfile(userId)
.subscribeOn(Schelers.io())
.subscribe(new Subscriber<UserProfileResp>(){
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(UserProfileResp userProfileResp) {
}
});
}
❽ rxjava能代替handler吗
RxJava好在哪换句话说,『同样是做异步,为什么人们用它,而不用现成的AsyncTask/Handler/XXX/?』一个词:简洁。异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。Android创造的AsyncTask和Handler,其实都是为了让异步代码更加简洁。RxJava的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。假设有这样一个需求:界面上有一个自定义的视图imageCollectorView,它的作用是显示多张图片,并能使用addImage(Bitmap)方法来任意增加显示的图片。现在需要程序将一个给出的目录数组File[]folders中每个目录下的png图片都加载出来并显示在imageCollectorView中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在UI线程执行。常用的实现方式有多种,我这里贴出其中一种:newThread(){@Overridepublicvoidrun(){super.run();for(Filefolder:folders){File[]files=folder.listFiles();for(Filefile:files){if(file.getName().endsWith(".png")){finalBitmapbitmap=getBitmapFromFile(file);getActivity().runOnUiThread(newRunnable(){@Overridepublicvoidrun(){imageCollectorView.addImage(bitmap);}});}}}}}.start();而如果使用RxJava,实现方式是这样的:Observable.from(folders).flatMap(newFunc1>(){@OverridepublicObservablecall(Filefile){returnObservable.from(file.listFiles());}}).filter(newFunc1(){@OverridepublicBooleancall(Filefile){returnfile.getName().endsWith(".png");}}).map(newFunc1(){@OverridepublicBitmapcall(Filefile){returngetBitmapFromFile(file);}}).subscribeOn(Schelers.io()).observeOn(AndroidSchelers.mainThread()).subscribe(newAction1(){@Overridepublicvoidcall(Bitmapbitmap){imageCollectorView.addImage(bitmap);}});那位说话了:『你这代码明明变多了啊!简洁个毛啊!』大兄弟你消消气,我说的是逻辑的简洁,不是单纯的代码量少(逻辑简洁才是提升读写代码速度的必杀技对不?)。观察一下你会发现,RxJava的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。当需求变得复杂时,这种优势将更加明显(试想如果还要求只选取前10张图片,常规方式要怎么?如果有这样那样的要求呢?再试想,在这一大堆需求实现完两个月之后需要改功能,当你翻回这里看到自己当初写下的那一片迷之缩进,你能保证自己将迅速看懂,而不是对着代码重新捋一遍思路?)。另外,如果你的IDE是AndroidStudio,其实每次打开某个Java文件的时候,你会看到被自动Lambda化的预览,这将让你更加清晰地看到程序逻辑:Observable.from(folders).flatMap((Func1)(folder)->{Observable.from(file.listFiles())}).filter((Func1)(file)->{file.getName().endsWith(".png")}).map((Func1)(file)->{getBitmapFromFile(file)}).subscribeOn(Schelers.io()).observeOn(AndroidSchelers.mainThread()).subscribe((Action1)(bitmap)->{imageCollectorView.addImage(bitmap)});如果你习惯使用Retrolambda,你也可以直接把代码写成上面这种简洁的形式。而如果你看到这里还不知道什么是Retrolambda,我不建议你现在就去学习它。原因有两点:1.Lambda是把双刃剑,它让你的代码简洁的同时,降低了代码的可读性,因此同时学习RxJava和Retrolambda可能会让你忽略RxJava的一些技术细节;2.Retrolambda是Java6/7对Lambda表达式的非官方兼容方案,它的向后兼容性和稳定性是无法保障的,因此对于企业项目,使用Retrolambda是有风险的。所以,与很多RxJava的推广者不同,我并不推荐在学习RxJava的同时一起学习Retrolambda。事实上,我个人虽然很欣赏Retrolambda,但我从来不用它。