安卓开发中,使用 Retrofit +RxJava + Dagger2 可以说是目前比较潮的一套框架,所以就此研究了下。
关于Retrofit和RxJava的学习可以看下这个:Retrofit+RxJava实战日志
源码下载
首先配置依赖:
//RxJava
compile 'io.reactivex:rxjava:1.0.19'
//RxAndroid
compile 'io.reactivex:rxandroid:1.2.1'
//Jackson
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.1'
compile 'com.fasterxml.jackson.core:jackson-core:2.8.1'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.1'
//Retrofit2
compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:converter-jackson:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
//Dagger2
compile 'com.google.dagger:dagger:2.0.2'
compile 'com.google.dagger:dagger-compiler:2.0.2'
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.iuoon.mwuyz.tmclient">
<!--添加网络访问权限 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK" ></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/s_logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".activity.WelcomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.MainActivity"></activity>
</application>
</manifest>
新建Retrofit通信工具类
package com.iuoon.mwuyz.tmclient.common;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
/**
* Created by mwuyz on 2016/8/17.
*/
public abstract class RRetrofit {
public static String BASE_URL = "http://192.168.1.118:8080";
private static final int DEFAULT_TIMEOUT = 3;
public static <T> T create(final Class<T> cls) {
Retrofit.Builder builder = new Retrofit.Builder();
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
//设置超时时间
OkHttpClient client=httpBuilder.readTimeout(DEFAULT_TIMEOUT, TimeUnit.MINUTES)
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.MINUTES).writeTimeout(DEFAULT_TIMEOUT, TimeUnit.MINUTES)
.build();
Retrofit retrofit = builder
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(JacksonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
return retrofit.create(cls);
}
}
定义api调用接口:
package com.iuoon.mwuyz.tmclient.api;
import com.iuoon.mwuyz.tmclient.common.TransVo;
import com.iuoon.mwuyz.tmclient.model.TWNotice;
import com.iuoon.mwuyz.tmclient.model.TWUser;
import java.util.List;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
import rx.Observable;
/**
* @Title 服务端api接口
* @Query 表示这是一个参数
* @Description :通信请求api接口
* Created by iuoon on 2016/8/17.
* @version v1.0.0
*/
public interface TiyoService {
// 登陆
@POST("/login")
Observable<TransVo<TWUser>> login(@Query("userName") String userName, @Query("password") String password);
@POST("/register")
Observable<TransVo<TWUser>> register(@Body TWUser user);
@GET("/getNotice")
Observable<TransVo<List<TWNotice>>> getNotice();
}
package com.iuoon.mwuyz.tmclient.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;
import com.iuoon.mwuyz.tmclient.R;
import com.iuoon.mwuyz.tmclient.api.TiyoService;
import com.iuoon.mwuyz.tmclient.common.RRetrofit;
import com.iuoon.mwuyz.tmclient.common.TransVo;
import com.iuoon.mwuyz.tmclient.model.TWNotice;
import com.iuoon.mwuyz.tmclient.model.TWUser;
import java.util.List;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
/**
* 测试rxjava+Retrofit+jackson
*/
public class MainActivity extends AppCompatActivity {
private TiyoService service= RRetrofit.create(TiyoService.class);
private EditText etext;
private TextView ttext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etext=(EditText) findViewById(R.id.editText);
ttext=(TextView) findViewById(R.id.textView3);
login();
getNotice();
}
/*此处用RxJava+Retrofit */
public void login(){
service.login("iuoon","123456")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( new Subscriber<TransVo<TWUser>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.e("login error----->", e.toString());
}
@Override
public void onNext(TransVo<TWUser> lresp) {
Log.d("login success----->",lresp.getCode()+"---"+ lresp.getMessage());
etext.setText(lresp.getParams().getName());
}
});
}
public void getNotice(){
service.getNotice()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( new Subscriber<TransVo<List<TWNotice>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.e("getNotice error----->", e.toString());
}
@Override
public void onNext(TransVo<List<TWNotice>> lresp) {
Log.d("getNotice success----->",lresp.getCode()+"---"+ lresp.getMessage());
List<TWNotice> noticeList=lresp.getParams();
Log.d("title:",noticeList.get(0).getNoticeTitle());
ttext.setText(noticeList.get(0).getNoticeTitle());
}
});
}
}
简单页面效果: