導航:首頁 > 編程語言 > rxjava讀取緩存

rxjava讀取緩存

發布時間:2023-02-24 17:29:05

❶ 真的有必要用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,但我從來不用它。

閱讀全文

與rxjava讀取緩存相關的資料

熱點內容
電腦無法向u盤傳輸文件 瀏覽:823
bpn配置文件 瀏覽:932
501完美越獄工具 瀏覽:119
中間夾菜單裡面不能顯示壓縮文件 瀏覽:952
如何指導小學生參加編程比賽 瀏覽:275
物業的招標文件有哪些 瀏覽:452
保存游戲文件名非法或只讀 瀏覽:258
js怎麼做圖片時鍾 瀏覽:451
華為應用裡面有了app說明什麼 瀏覽:801
資料庫中xy是什麼意思 瀏覽:893
u盤打不開提示找不到應用程序 瀏覽:609
網站功能介紹怎麼寫 瀏覽:954
word在試圖打開文件時錯誤 瀏覽:108
主板無vga插槽怎麼連接編程器 瀏覽:521
錄視頻文件在哪裡刪除 瀏覽:881
word2013如何插入文件 瀏覽:233
proe教程百度網盤 瀏覽:197
如何控制遠程linux伺服器 瀏覽:740
it教學app有哪些 瀏覽:34
怎麼在ps摳的圖變成矢量文件 瀏覽:405

友情鏈接