您的位置:首页 > 编程语言 > Java开发

Dagger2+Retrofit2+RxJava、Mvp概要

2016-11-22 18:19 274 查看

请求天气的小应用,练习如何使用Dagger2+Retrofit2+RxJava

gradle配置



RxJava异步加载框架、Retrofit2网络框架、Dagger2依赖注入框架

project/build.gradle

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
//apt必须添加
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}


project/app/build.gradle

apply plugin: 'com.android.application'
//添加apt
apply plugin: 'android-apt'

android {
compileSdkVersion 24
buildToolsVersion "24.0.2"

defaultConfig {
applicationId "com.myweather"
minSdkVersion 17
targetSdkVersion 24
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.2.1'
// Net
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
// Annotation
compile 'com.google.dagger:dagger:2.0.2'
apt 'com.google.dagger:dagger-compiler:2.0.2'
provided 'org.glassfish:javax.annotation:10.0-b28'
compile 'com.jakewharton:butterknife:7.0.1'
// Rx
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.5'
}


项目结构



Mvp流程



MainPresenter作为MainActivity和MainModel之间的桥梁,当MainActivity需要请求数据时,通知MainPresenter;MainPresenter通知MainModel需要数据,MainModel通过Retrofit从网络中获取数据,若是请求成功,则把数据传给MainPresenter,若是请求失败,则把失败信息传给MainPresenter。

MainPresenter从MainModel中获取数据信息后通知MainActivity更新数据。

MainActivity中的MainPresenter实例是由Dagger2注入的单例。

MainActivity的源码

public class MainActivity extends AppCompatActivity implements MainView {

@Bind(R.id.tv_displayWeather) TextView tv;
@Bind(R.id.progressBar) ProgressBar progressBar;

//Dagger不能注入私有变量
@Inject @Singleton public MainPresenter myPresenter;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏
setContentView(R.layout.activity_main);
ButterKnife.bind(this);//ButterKnife注入
initView();

}

public void displayWeather(View view) {
myPresenter.getData();
}

@Override
public void initView() {
MainComponent component= DaggerMainComponent.builder().mainPresenterModule(new MainPresenterModule(this)).build();
component.inject(this);
}

@Override
public void showData(MainModelBean mybean) {
if(mybean==null){
tv.setText("请求失败");
}
else{
MainModelBean.WeatherinfoEntity bean = mybean.getWeatherinfo();
String city=bean.getCity();
String wd=bean.getWD();
String ws=bean.getWS();
String time=bean.getTime();
String data="城市:"+city+"\n风向:"+wd+"\n风级:"+ws+"\n发布时间:"+time;
tv.setText(data);
}
hideProgressBar();
}
public void showProgressBar(){
progressBar.setVisibility(View.VISIBLE);
}
public void hideProgressBar(){
progressBar.setVisibility(View.GONE);
}
}


MainView源码:

public interface MainView {

void initView();
void showData(MainModelBean bean);
void showProgressBar();
void hideProgressBar();

}


MainModel的代码如下:

public class MainModel {
String baseUrl="http://www.weather.com.cn/adat/sk/";

private List<MainModelBean> list = new ArrayList<>();
private MainPresenter mainPresenter;
public MainModel(MainPresenter mainPresenter){
this.mainPresenter=mainPresenter;
}
public void getData(){
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
WeatherService service=retrofit.create(WeatherService.class);
service.getModelBean("101010100")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new MySubscriber());
}
interface WeatherService{
@GET("{cityId}"+".html")
Observable<MainModelBean> getModelBean(@Path("cityId") String cityId);
}
class MySubscriber extends Subscriber<MainModelBean>{
@Override
public void onCompleted() {
mainPresenter.loadDataSuccess(list);
}

@Override
public void onError(Throwable e) {
mainPresenter.loadDataFailure();
}

@Override
public void onNext(MainModelBean mainModelBean) {
list.add(mainModelBean);
}
}
}


MainPresenter源码如下:

public class MainPresenter {
private MainView mainView;

public MainModel mainModel=new MainModel(this);

@Inject @Singleton
public MainPresenter(MainView mainView) {
this.mainView=mainView;

}
public void getData(){
mainView.showProgressBar();
mainModel.getData();
}
public void loadDataSuccess(List<MainModelBean> list) {

mainView.showData(list.get(0));
}
public void loadDataFailure(){
mainView.showData(null);
}
}


源码地址:https://github.com/YangJiexian/AndroidMvp

-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: