├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── liuxaing │ │ └── retrofit │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── finddreams │ │ │ └── retrofit │ │ │ ├── App.java │ │ │ ├── api │ │ │ ├── config │ │ │ │ ├── AppComponent.java │ │ │ │ ├── ConstantApi.java │ │ │ │ └── InteractorModule.java │ │ │ ├── interaction │ │ │ │ ├── WeatherInteractor.java │ │ │ │ └── WeatherInteractorImpl.java │ │ │ ├── net │ │ │ │ ├── BaseSubsribe.java │ │ │ │ └── RestApiAdapter.java │ │ │ └── service │ │ │ │ └── WeatherApiService.java │ │ │ ├── bean │ │ │ └── WeatherResultBean.java │ │ │ └── ui │ │ │ └── MainActivity.java │ └── res │ │ ├── layout │ │ ├── activity_change_data.xml │ │ └── activity_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── liuxaing │ └── retrofit │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | ### Android template 3 | # Built application files 4 | *.apk 5 | *.ap_ 6 | 7 | # Files for the Dalvik VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # Generated files 14 | bin/ 15 | gen/ 16 | 17 | # Gradle files 18 | .gradle/ 19 | build/ 20 | 21 | # Local configuration file (sdk path, etc) 22 | local.properties 23 | 24 | # Proguard folder generated by Eclipse 25 | proguard/ 26 | 27 | # Log Files 28 | *.log 29 | 30 | # Android Studio Navigation editor temp files 31 | .navigation/ 32 | 33 | *.iml 34 | .gradle 35 | /local.properties 36 | /.idea/workspace.xml 37 | /.idea/libraries 38 | .DS_Store 39 | /build 40 | /captures 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #怎么用Retrofit2.0+RxJava+Dragger2来实现Android网络构架搭建,给大家提供一种思路,供大家参考参考。 2 | http://blog.csdn.net/finddreams/article/details/50849385 3 | 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | ### Android template 2 | # Built application files 3 | *.apk 4 | *.ap_ 5 | 6 | # Files for the Dalvik VM 7 | *.dex 8 | 9 | # Java class files 10 | *.class 11 | 12 | # Generated files 13 | bin/ 14 | gen/ 15 | 16 | # Gradle files 17 | .gradle/ 18 | build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | # Android Studio Navigation editor temp files 30 | .navigation/ 31 | 32 | /build 33 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'com.neenbedankt.android-apt' 3 | 4 | android { 5 | compileSdkVersion 23 6 | buildToolsVersion "23.0.2" 7 | 8 | defaultConfig { 9 | applicationId "com.finddreams.retrofit" 10 | minSdkVersion 15 11 | targetSdkVersion 23 12 | versionCode 1 13 | versionName "1.0" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | dependencies { 24 | compile fileTree(include: ['*.jar'], dir: 'libs') 25 | testCompile 'junit:junit:4.12' 26 | compile 'com.android.support:appcompat-v7:23.1.1' 27 | //retrofit 28 | compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' 29 | //gson解析 30 | compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' 31 | //rxjava 32 | compile 'io.reactivex:rxandroid:1.1.0' 33 | compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' 34 | //dragger2 35 | provided 'org.glassfish:javax.annotation:10.0-b28' 36 | apt 'com.google.dagger:dagger-compiler:2.0.2' 37 | compile 'com.google.dagger:dagger:2.0.2' 38 | } 39 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | -keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | public *; 17 | } 18 | -dontwarn retrofit2.** 19 | -keep class retrofit2.** { *; } 20 | -keepattributes Signature 21 | -keepattributes Exceptions 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/liuxaing/retrofit/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.liuxaing.retrofit; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/App.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import com.finddreams.retrofit.api.config.AppComponent; 7 | import com.finddreams.retrofit.api.config.DaggerAppComponent; 8 | import com.finddreams.retrofit.api.config.InteractorModule; 9 | 10 | /** 11 | * Application类 12 | * 13 | * @author finddreams 14 | * @address http://blog.csdn.net/finddreams 15 | */ 16 | public class App extends Application { 17 | private AppComponent component; 18 | 19 | @Override 20 | public void onCreate() { 21 | super.onCreate(); 22 | 23 | setDraggerConfig(); 24 | } 25 | 26 | public AppComponent component() { 27 | return component; 28 | } 29 | 30 | public static App get(Context context) { 31 | return (App) context.getApplicationContext(); 32 | } 33 | 34 | /** 35 | * 初始化Dragger,DaggerAppComponent是自动生成,需要Rebuild 36 | */ 37 | private void setDraggerConfig() { 38 | component = DaggerAppComponent.builder().interactorModule(new InteractorModule()) 39 | .build(); 40 | component.inject(this); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/config/AppComponent.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.config; 2 | 3 | 4 | import com.finddreams.retrofit.App; 5 | import com.finddreams.retrofit.api.interaction.WeatherInteractor; 6 | 7 | import javax.inject.Singleton; 8 | 9 | import dagger.Component; 10 | 11 | /** 12 | * 声明AppComponent组件 13 | * 14 | * @author finddreams 15 | * @address http://blog.csdn.net/finddreams 16 | */ 17 | @Singleton 18 | @Component( 19 | modules = { 20 | InteractorModule.class, 21 | } 22 | ) 23 | public interface AppComponent { 24 | void inject(App app); 25 | 26 | WeatherInteractor getWeatherInteractor(); 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/config/ConstantApi.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.config; 2 | 3 | /** 4 | * 常量类 5 | * 6 | * @author finddreams 7 | * @address http://blog.csdn.net/finddreams 8 | */ 9 | public interface ConstantApi { 10 | String BaiduUrl = "http://apis.baidu.com/"; //百度api地址 11 | String baiduKey = "27b6fb21f2b42e9d70cd722b2ed038a9"; //百度apikey 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/config/InteractorModule.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.config; 2 | 3 | 4 | import com.finddreams.retrofit.api.interaction.WeatherInteractor; 5 | import com.finddreams.retrofit.api.interaction.WeatherInteractorImpl; 6 | import com.finddreams.retrofit.api.net.RestApiAdapter; 7 | import com.finddreams.retrofit.api.service.WeatherApiService; 8 | 9 | import dagger.Module; 10 | import dagger.Provides; 11 | import retrofit2.Retrofit; 12 | 13 | /** 14 | * Module类 15 | * 提供需要注入的类 16 | * 17 | * @author finddreams 18 | * @address http://blog.csdn.net/finddreams 19 | */ 20 | @Module 21 | public class InteractorModule { 22 | @Provides 23 | public Retrofit provideRestAdapter() { 24 | return RestApiAdapter.getInstance(); 25 | } 26 | 27 | @Provides 28 | public WeatherApiService provideHomeApi(Retrofit restAdapter) { 29 | return restAdapter.create(WeatherApiService.class); 30 | } 31 | 32 | @Provides 33 | public WeatherInteractor provideHomeInteractor(WeatherApiService myApi) { 34 | return new WeatherInteractorImpl(myApi); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/interaction/WeatherInteractor.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.interaction; 2 | 3 | 4 | import com.finddreams.retrofit.api.net.BaseSubsribe; 5 | import com.finddreams.retrofit.bean.WeatherResultBean; 6 | 7 | import rx.Subscription; 8 | 9 | /** 10 | * 获取天气信息接口 11 | * 12 | * @author finddreams 13 | * @address http://blog.csdn.net/finddreams 14 | */ 15 | public interface WeatherInteractor { 16 | Subscription queryWeather(String apikey, String cityname, BaseSubsribe subsribe); 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/interaction/WeatherInteractorImpl.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.interaction; 2 | 3 | 4 | import com.finddreams.retrofit.api.net.BaseSubsribe; 5 | import com.finddreams.retrofit.api.service.WeatherApiService; 6 | import com.finddreams.retrofit.bean.WeatherResultBean; 7 | 8 | import javax.inject.Inject; 9 | 10 | import rx.Observable; 11 | import rx.Subscription; 12 | import rx.android.schedulers.AndroidSchedulers; 13 | import rx.schedulers.Schedulers; 14 | 15 | /** 16 | * 获取天气信息实现类 17 | */ 18 | public class WeatherInteractorImpl implements WeatherInteractor { 19 | private final WeatherApiService api; 20 | 21 | @Inject 22 | public WeatherInteractorImpl(WeatherApiService myApi) { 23 | this.api = myApi; 24 | } 25 | 26 | 27 | @Override 28 | public Subscription queryWeather(String apikey, String cityname, BaseSubsribe subsribe) { 29 | Observable observable = api.queryWeather(apikey, cityname); 30 | Subscription subscribe = observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(subsribe); 31 | return subscribe; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/net/BaseSubsribe.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.net; 2 | 3 | import android.util.Log; 4 | 5 | import rx.Subscriber; 6 | 7 | /** 8 | * 观察者 9 | * 10 | * @author finddreams 11 | * @address http://blog.csdn.net/finddreams 12 | */ 13 | public abstract class BaseSubsribe extends Subscriber { 14 | private static final String TAG = "BaseSubsribe"; 15 | 16 | 17 | @Override 18 | public void onStart() { 19 | super.onStart(); 20 | Log.i(TAG, "onStart"); 21 | 22 | } 23 | 24 | @Override 25 | public void onNext(T t) { 26 | Log.i(TAG, "response" + t.toString()); 27 | 28 | onSuccess(t); 29 | } 30 | 31 | @Override 32 | public void onCompleted() { 33 | Log.i(TAG, "onCompleted"); 34 | 35 | } 36 | 37 | public abstract void onSuccess(T result); 38 | 39 | @Override 40 | public void onError(Throwable e) { 41 | e.printStackTrace(); 42 | Log.i(TAG, "onError" + e.getMessage()); 43 | 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/net/RestApiAdapter.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.net; 2 | 3 | 4 | import com.finddreams.retrofit.api.config.ConstantApi; 5 | 6 | import okhttp3.OkHttpClient; 7 | import retrofit2.Retrofit; 8 | import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; 9 | import retrofit2.converter.gson.GsonConverterFactory; 10 | 11 | /** 12 | * Retrofit的实体类 13 | */ 14 | public class RestApiAdapter { 15 | private static Retrofit retrofit = null; 16 | 17 | public static Retrofit getInstance() { 18 | if (retrofit == null) { 19 | GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(); 20 | OkHttpClient okHttpClient = new OkHttpClient(); 21 | OkHttpClient.Builder builder = okHttpClient.newBuilder(); 22 | builder.retryOnConnectionFailure(true); 23 | retrofit = new Retrofit.Builder().client(okHttpClient) 24 | .baseUrl(ConstantApi.BaiduUrl) 25 | .addConverterFactory(gsonConverterFactory) 26 | .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 27 | .build(); 28 | } 29 | return retrofit; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/api/service/WeatherApiService.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.api.service; 2 | 3 | 4 | import com.finddreams.retrofit.bean.WeatherResultBean; 5 | 6 | import retrofit2.http.GET; 7 | import retrofit2.http.Header; 8 | import retrofit2.http.Query; 9 | import rx.Observable; 10 | 11 | /** 12 | * 天气接口Api 13 | */ 14 | public interface WeatherApiService { 15 | /** 16 | * 查询天气 17 | */ 18 | @GET("apistore/weatherservice/cityname") 19 | Observable queryWeather(@Header("apikey") String apikey, @Query("cityname") String cityname); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/bean/WeatherResultBean.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.bean; 2 | 3 | /** 4 | * @Author finddreams 5 | * @Address http://blog.csdn.net/finddreams 6 | * @Time 2016/3/10 7 | */ 8 | public class WeatherResultBean { 9 | 10 | 11 | private int errNum; 12 | private String errMsg; 13 | 14 | 15 | private RetDataEntity retData; 16 | 17 | public void setErrNum(int errNum) { 18 | this.errNum = errNum; 19 | } 20 | 21 | public void setErrMsg(String errMsg) { 22 | this.errMsg = errMsg; 23 | } 24 | 25 | public void setRetData(RetDataEntity retData) { 26 | this.retData = retData; 27 | } 28 | 29 | public int getErrNum() { 30 | return errNum; 31 | } 32 | 33 | public String getErrMsg() { 34 | return errMsg; 35 | } 36 | 37 | public RetDataEntity getRetData() { 38 | return retData; 39 | } 40 | 41 | public static class RetDataEntity { 42 | private String city; 43 | private String pinyin; 44 | private String citycode; 45 | private String date; 46 | private String time; 47 | private String postCode; 48 | private double longitude; 49 | private double latitude; 50 | private String altitude; 51 | private String weather; 52 | private String temp; 53 | private String l_tmp; 54 | private String h_tmp; 55 | private String WD; 56 | private String WS; 57 | private String sunrise; 58 | private String sunset; 59 | 60 | public void setCity(String city) { 61 | this.city = city; 62 | } 63 | 64 | public void setPinyin(String pinyin) { 65 | this.pinyin = pinyin; 66 | } 67 | 68 | public void setCitycode(String citycode) { 69 | this.citycode = citycode; 70 | } 71 | 72 | public void setDate(String date) { 73 | this.date = date; 74 | } 75 | 76 | public void setTime(String time) { 77 | this.time = time; 78 | } 79 | 80 | public void setPostCode(String postCode) { 81 | this.postCode = postCode; 82 | } 83 | 84 | public void setLongitude(double longitude) { 85 | this.longitude = longitude; 86 | } 87 | 88 | public void setLatitude(double latitude) { 89 | this.latitude = latitude; 90 | } 91 | 92 | public void setAltitude(String altitude) { 93 | this.altitude = altitude; 94 | } 95 | 96 | public void setWeather(String weather) { 97 | this.weather = weather; 98 | } 99 | 100 | public void setTemp(String temp) { 101 | this.temp = temp; 102 | } 103 | 104 | public void setL_tmp(String l_tmp) { 105 | this.l_tmp = l_tmp; 106 | } 107 | 108 | public void setH_tmp(String h_tmp) { 109 | this.h_tmp = h_tmp; 110 | } 111 | 112 | public void setWD(String WD) { 113 | this.WD = WD; 114 | } 115 | 116 | public void setWS(String WS) { 117 | this.WS = WS; 118 | } 119 | 120 | public void setSunrise(String sunrise) { 121 | this.sunrise = sunrise; 122 | } 123 | 124 | public void setSunset(String sunset) { 125 | this.sunset = sunset; 126 | } 127 | 128 | public String getCity() { 129 | return city; 130 | } 131 | 132 | public String getPinyin() { 133 | return pinyin; 134 | } 135 | 136 | public String getCitycode() { 137 | return citycode; 138 | } 139 | 140 | public String getDate() { 141 | return date; 142 | } 143 | 144 | public String getTime() { 145 | return time; 146 | } 147 | 148 | public String getPostCode() { 149 | return postCode; 150 | } 151 | 152 | public double getLongitude() { 153 | return longitude; 154 | } 155 | 156 | public double getLatitude() { 157 | return latitude; 158 | } 159 | 160 | public String getAltitude() { 161 | return altitude; 162 | } 163 | 164 | public String getWeather() { 165 | return weather; 166 | } 167 | 168 | public String getTemp() { 169 | return temp; 170 | } 171 | 172 | public String getL_tmp() { 173 | return l_tmp; 174 | } 175 | 176 | public String getH_tmp() { 177 | return h_tmp; 178 | } 179 | 180 | public String getWD() { 181 | return WD; 182 | } 183 | 184 | public String getWS() { 185 | return WS; 186 | } 187 | 188 | public String getSunrise() { 189 | return sunrise; 190 | } 191 | 192 | public String getSunset() { 193 | return sunset; 194 | } 195 | } 196 | } 197 | -------------------------------------------------------------------------------- /app/src/main/java/com/finddreams/retrofit/ui/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.finddreams.retrofit.ui; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.View; 6 | import android.widget.EditText; 7 | import android.widget.TextView; 8 | 9 | import com.finddreams.retrofit.App; 10 | import com.finddreams.retrofit.R; 11 | import com.finddreams.retrofit.api.config.AppComponent; 12 | import com.finddreams.retrofit.api.config.ConstantApi; 13 | import com.finddreams.retrofit.api.interaction.WeatherInteractor; 14 | import com.finddreams.retrofit.api.net.BaseSubsribe; 15 | import com.finddreams.retrofit.bean.WeatherResultBean; 16 | 17 | import rx.Subscription; 18 | 19 | /** 20 | * 主页 21 | * 22 | * @author finddreams 23 | * @address http://blog.csdn.net/finddreams 24 | */ 25 | public class MainActivity extends AppCompatActivity { 26 | 27 | 28 | private AppComponent component; 29 | private WeatherInteractor weatherInteractor; 30 | private EditText city; 31 | private TextView queryresult; 32 | 33 | @Override 34 | protected void onCreate(Bundle savedInstanceState) { 35 | super.onCreate(savedInstanceState); 36 | setContentView(R.layout.activity_main); 37 | city = (EditText) findViewById(R.id.city); 38 | queryresult = (TextView) findViewById(R.id.queryresult); 39 | //获取到AppComponent组件 40 | component = App.get(this).component(); 41 | //通过AppComponent拿到WeatherInteractor 42 | weatherInteractor = component.getWeatherInteractor(); 43 | findViewById(R.id.query).setOnClickListener(new View.OnClickListener() { 44 | @Override 45 | public void onClick(View v) { 46 | queryWeatherData(); 47 | 48 | } 49 | 50 | }); 51 | 52 | 53 | } 54 | 55 | public void queryWeatherData() { 56 | String content = city.getText().toString(); 57 | //调用查询天气接口的方法 58 | Subscription subscription = weatherInteractor.queryWeather(ConstantApi.baiduKey, content, new BaseSubsribe() { 59 | @Override 60 | public void onSuccess(WeatherResultBean result) { 61 | 62 | WeatherResultBean.RetDataEntity retData = result.getRetData(); 63 | queryresult.setText(retData.getCity() + ":" + retData.getWeather() + ":" + retData.getDate()); 64 | } 65 | 66 | @Override 67 | public void onError(Throwable e) { 68 | super.onError(e); 69 | queryresult.setText("查询失败"); 70 | 71 | } 72 | } 73 | ); 74 | //取消请求 75 | // subscription.unsubscribe(); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_change_data.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 |