Rxjava how to combine with retrofit
first throw out the contents of the Build.gradle file
dependencies {
Compile filetree (dir: ' Libs ', include: [' *.jar '])
testcompile ' junit:junit:4.12 ' compile '
com.android.support:appcompat-v7:23.2.0 '
compile ' io.reactivex:rxjava:1.1.0 '
compile ' Io.reactivex: rxandroid:1.1.0 '
compile ' com.squareup.retrofit2:retrofit:2.0.0-beta4 '
compile ' com.squareup.retrofit2: Converter-gson:2.0.0-beta4 '
compile ' com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4 '
compile ' com.google.code.gson:gson:2.6.2 '
compile ' com.jakewharton:butterknife:7.0.1 '
}
In other words, this article is based on RxJava1.1.0 and retrofit 2.0.0-beta4. Adding Rxandroid is due to threading problems in Rxjava.
The following first build a basic page, the page is very simple, first look at the file directory structure
The code for Activity_main.xml is as follows:
<?xml version= "1.0" encoding= "Utf-8"?> <relativelayout xmlns:android= "http://schemas.android.com/apk/res/" Android "xmlns:tools=" Http://schemas.android.com/tools "android:layout_width=" Match_parent "android:layout_height = "Match_parent" android:paddingbottom= "@dimen/activity_vertical_margin" android:paddingleft= "@dimen/activity_ Horizontal_margin "android:paddingright=" @dimen/activity_horizontal_margin "android:paddingtop=" @dimen/activity_ Vertical_margin "tools:context=". Activity. Mainactivity "> <button android:id=" @+id/click_me_bn "android:layout_width=" Match_parent "Android:layo" ut_height= "Wrap_content" android:layout_alignparentbottom= "true" android:padding= "5DP" android:text= "dot Me" a Ndroid:textsize= "16sp"/> <textview android:id= "@+id/result_tv" android:layout_width= "Match_parent" and
roid:layout_height= "Match_parent" android:layout_above= "@id/click_me_bn" android:text= "Hello World!" Android:textsiZe= "16sp"/> </RelativeLayout>
The code for Mainactivity.java is as follows:
Package com.queen.rxjavaretrofitdemo.activity;
Import Android.os.Bundle;
Import android.support.v7.app.AppCompatActivity;
Import Android.widget.Button;
Import Android.widget.TextView;
Import COM.QUEEN.RXJAVARETROFITDEMO.R;
Import Butterknife. Bind;
Import Butterknife. Butterknife;
Import Butterknife. OnClick;
public class Mainactivity extends Appcompatactivity {
@Bind (r.id.click_me_bn)
Button clickmebn;
@Bind (R.ID.RESULT_TV)
TextView Resulttv;
@Override
protected void onCreate (Bundle savedinstancestate) {
super.oncreate (savedinstancestate);
Setcontentview (r.layout.activity_main);
Butterknife.bind (this);
}
@OnClick (r.id.click_me_bn) public
void OnClick () {
getmovie ();
}
The network request
private void Getmovie () {
}
}
Be careful not to forget to add network permissions
<uses-permission android:name= "Android.permission.INTERNET"/>
Cache configuration
There are a number of ways to implement offline caching for app network data, such as storing in a database (parsing it when saving JSON use), storing proprietary files, or sharedpreference, etc., or you can implement LRUCache and
Disklrucache These two caching policies constitute level two caching (memory and disk)
Caching is very important for the mobile end:
- Reduce the number of requests and reduce server pressure.
- Local data is read faster, leaving the page blank for hundreds of milliseconds.
- Provide data in the absence of a network.
The okhttp cache design is similar to the browser's cache design, and can be cached by adding a response header.
Retrofit is an android (Java) client implementation that relies on Okhttp's set of restful architectures
By constructing the. Client () method of retrofit, the implementation of the okhttp is changed to achieve the effect of caching, without introducing the specific use of retrofit.
The following is an example of the implementation of a network cache, no network read-only cache
File Cachefile = new file (App.getcontext (). Getexternalcachedir (), "Zhibookcache");
Cache cache = New cache (CACHEFILE,1024*1024*50); Interceptor Interceptor = new Interceptor () {@Override public Response intercept (Chain Chain) throws Ioexcept
ion {Request Request = Chain.request (); if (! Httputils.isnetworkconnected (App.getcontext ())) {request = Request.newbuilder (). CacheControl (Cac
Hecontrol.force_cache). build ();
} Response Response = chain.proceed (request);
if (httputils.isnetworkconnected (App.getcontext ())) {int maxage = 0 * 60;
Set Cache timeout 0 hours response.newbuilder () when there is a network. Header ("Cache-control", "public, max-age=" + maxage)
. Removeheader ("Pragma")/clear header information, because if the server does not support, it will return some interference information, do not clear the following cannot be effective. Build ();
else {//no network, set timeout of 4 weeks int maxstale = 60 * 60 * 24 * 28;
Response.newbuilder () . Header ("Cache-control", "Public, only-if-cached, max-stale=" + Maxstale). Removeheader ("Pragma
"). Build ();
return response;
}
};
Client = new Okhttpclient.builder (). cache (Cache). Addinterceptor (Interceptor). Build (); Retrofit = new Retrofit.builder (). BaseURL (retrofitapi.basic_daily). Addconverterfactory (gsonconverterfact
Ory.create ()). Addcalladapterfactory (Rxjavacalladapterfactory.create ()). Client (client). Build ();
Retrofitapi = Retrofit.create (Retrofitapi.class);
The following code is then invoked to get the serialized object after the request
Retrofitapi.getdaily ().
Subscribeon (Schedulers.io ()).
Observeon (Androidschedulers.mainthread ())
. Subscribe (new observer<dailybean> () {
@Override public
void oncompleted () {
}
@Override
public void OnError (Throwable e) {
log.d (tag,e.getmessage ());
}
@Override public
void OnNext (Dailybean bean) {
listener.ongetdailysuccess (bean);
}
});
Finally attach the Retrofit interface section
@GET ("News/latest")
observable<dailybean> getdaily ();