Dagger2+Retrofit+RxJava練習

請求天氣的小應用,練習如何使用Dagger2+Retrofit+RxJava

效果預覽

Paste_Image.png

gradle配置

  • project/build.gradle
dependencies {    
        classpath 'com.android.tools.build:gradle:2.0.0'    
        classpath 'me.tatarka:gradle-retrolambda:3.2.4'    
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
  • project/app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.neenbedankt.android-apt'
android {    
              ......
        compileOptions {       
                 sourceCompatibility JavaVersion.VERSION_1_8      
                 targetCompatibility JavaVersion.VERSION_1_8    
        }
              ......    
}
dependencies {    
        ......
        compile 'com.jakewharton:butterknife:7.0.1'    

        compile 'com.squareup.retrofit2:retrofit:2.0.1'    
        compile 'com.squareup.retrofit2:converter-gson:2.0.2'    
        compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'    

        compile 'io.reactivex:rxandroid:1.1.0'    
        compile 'io.reactivex:rxjava:1.1.0'    

        compile 'com.google.dagger:dagger:2.1'    
        apt 'com.google.dagger:dagger-compiler:2.1'    
        provided 'org.glassfish:javax.annotation:10.0-b28'
}

項目結構

Paste_Image.png

mvp流程

MainPresenter作為MainActivityMainModel之間的橋梁,當MainActivity需要請求數據時,通知MainPresenterMainPresenter通知MainModel需要數據,MainModel通過Retrofit從網絡中獲取數據,若是請求成功,則把數據傳給MainPresenter,若是請求失敗,則把失敗信息傳給MainPresenter
MainPresenterMainModel中獲取數據信息后通知MainActivity更新數據。


MainActivity中的MainPresenter實例是由Dagger2注入的單例。

public class MainActivity extends AppCompatActivity implements MainView {    
        @Bind(R.id.tv_displayWeather) TextView tv;
        @Bind(R.id.progressBar) ProgressBar progressBar;    
        @Inject @Singleton    public MainPresenter myPresenter; //Dagger不能注入私有變量  
        @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);   
         }
}

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/changeyb/SimpleMVPDemo

參考文章:Android MVP 實例(吳小龍同學)

http://wuxiaolong.me/2015/09/23/AndroidMVPSample/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容