Retrofit2+Rxjava2+nucleus5(简化Presenter)+ButterKnife(减少findViewById使用)

Retrofit:基于okhttp,对okhttp封装
Rxjava2:响应式触发,基于观察者模式、观察者、被观察者。
nucleus:基于MVP,简化Presenter,自定义Presenter需要继承RxPresenter,view一般为Fragment或者Activity;Fragment或者Activity必须继承Nucleusxxx(fragment/Activity)<自定义Presenter> ,Activity通过@RequiresPresenter<自定义presenter>。、

Retrofit+回调

APIService.java代码:

package com.xl.test;
/**
 * Created by hushendian on 2017/7/20.
 */

public interface APIService {
    /**
     * 此方法是不使用Rxjava2
     *
     * @param cityid
     * @param key
     * @return
     */
    @GET("weather?")
    Call<Weather> getWeather(@Query("cityid") String cityid, @Query("key") String key);

RetrofitManger.java代码

/**
 * Created by hushendian on 2017/7/20.
 */

public class RetrofitManger {
    public static final String TAG = "RetrofitManger";
    public static RetrofitManger _instance = null;

    public static RetrofitManger _getInstance() {
        if (_instance == null) {
            synchronized (RetrofitManger.class) {
                if (_instance == null) {
                    _instance = new RetrofitManger();
                }
            }
        }
        return _instance;
    }

    public static OkHttpClient getOkHttpClient() {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(30 * 1000, TimeUnit.MILLISECONDS)
                .readTimeout(30 * 1000, TimeUnit.MILLISECONDS)
                .build();
        return client;
    }

    public Retrofit getRetrofit() {
        return new Retrofit.Builder().baseUrl(Coanst.URL).client(getOkHttpClient())
                .addConverterFactory
                        (ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory
                        .create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }

    public APIService getService() {
        return getRetrofit().create(APIService.class);
    }
/**
 * 使用retrofit+回调
 */
    public Call<Weather> getCall(String WeatherId, String key) {

        return getService().getWeather(WeatherId, key);
    }


    public void getMsgFromServer(final OnResponseListener listener) {
        getCall("CN101040300", "e680b5cf2b0b4fc88bfe6bcee99f7c58").enqueue(new
        Callback<Weather>() {
            @Override
            public void
            onResponse
                    (Call<Weather> call, Response<Weather> response) {
                Log.d(TAG, "onResponse: " + response);
                listener.onSuccess(call, response);
            }

            @Override
            public void
            onFailure
                    (Call<Weather> call, Throwable t) {
                listener.onFaile(call, t);
            }
        });
    }

    public interface OnResponseListener {
        void onSuccess(Call<Weather> call, Response<Weather> response);

        void onFaile(Call<Weather> call, Throwable t);
    }



}

WeatherActivity.java 代码:

package com.xl.test;

@RequiresPresenter(WeatherPresenter.class)
public class WeatherActivity extends BaseActivity
        implements RetrofitManger.OnResponseListener {
 @BindView(R.id.bing_pic_img)
    ImageView bingPicImg;
    @BindView(R.id.nav_button)
    Button navButton;
    @BindView(R.id.title_city)
    TextView titleCity;
    @BindView(R.id.title_update_time)
    TextView titleUpdateTime;
    @BindView(R.id.degree_text)
    TextView degreeText;
    @BindView(R.id.weather_info_text)
    TextView weatherInfoText;
    @BindView(R.id.forecast_layout)
    LinearLayout forecastLayout;
    @BindView(R.id.aqi_text)
    TextView aqiText;
    @BindView(R.id.pm25_text)
    TextView pm25Text;
    @BindView(R.id.comfort_text)
    TextView comfortText;
    @BindView(R.id.car_wash_text)
    TextView carWashText;
    @BindView(R.id.sport_text)
    TextView sportText;
    @BindView(R.id.weather_layout)
    ScrollView weatherLayout;

    public static final String TAG = "WeatherActivity";
    private RetrofitManger retrofitManger;

    @Override
    protected void initView(Bundle bundle) {

        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }

        setContentView(R.layout.activity_weather);
        ButterKnife.bind(this);
        retrofitManger = RetrofitManger._getInstance();
       retrofitManger.getMsgFromServer(this);//Retrofit+回调
//        getMsg();//Rxjava2+retrofit

    }

    public void showWeatherInfo(Weather.HeadWeather weather) {
        String cityName = weather.basic.city;
        String updateTime = weather.basic.update.loc.split("")[1];
        String degre = weather.now.tmp + "℃";
        String weatherInfo = weather.now.cond.txt;
        titleCity.setText(cityName);
        titleUpdateTime.setText(updateTime);
        degreeText.setText(degre);
        weatherInfoText.setText(weatherInfo);
        forecastLayout.removeAllViews();
        for (Forecast forecast : weather.daily_forecast) {
         View view = LayoutInflater.from(this).inflate(R.layout.forecast_item, forecastLayout,false);
            TextView dateText = (TextView) view.findViewById(R.id.date_text);
            TextView infoText = (TextView) view.findViewById(R.id.info_text);
            TextView maxText = (TextView) view.findViewById(R.id.max_text);
            TextView minText = (TextView) view.findViewById(R.id.min_text);
            dateText.setText(forecast.date);
            infoText.setText(forecast.cond.txt_d);
            maxText.setText(forecast.tmp.max);
            minText.setText(forecast.tmp.min);
            forecastLayout.addView(view);
            if (weather.aqi != null) {
                aqiText.setText(weather.aqi.city.aqi);
                pm25Text.setText(weather.aqi.city.pm25);
            }
            String comfort = "舒适度:" + weather.suggestion.comf.txt;
            String carWash = "洗车指数:" + weather.suggestion.cw.txt;
            String sport = "运行建议:" + weather.suggestion.sport.txt;
            comfortText.setText(comfort);
            carWashText.setText(carWash);
            sportText.setText(sport);
            weatherLayout.setVisibility(View.VISIBLE);


        }

    }

    public void showErrormsg(Throwable throwable) {
        Toast.makeText(WeatherActivity.this, throwable.getLocalizedMessage(), 1).show();
        Log.d(TAG, "showErrormsg: " + throwable.getMessage());
    }


    @Override
    public void onSuccess(Call<Weather> call, retrofit2.Response<Weather> response) {
        Log.d(TAG, "onSuccess: " + response.body().getHeWeather().get(0).aqi.city.aqi);
        final Weather.HeadWeather weather = response.body().getHeWeather().get(0);
//        showWeatherInfo(weather);
    }

    @Override
    public void onFaile(Call<Weather> call, Throwable t) {
        Toast.makeText(WeatherActivity.this, "获取天气信息失败", Toast.LENGTH_SHORT).show();
    }
    }

Retrofit+Rxjava2

APIService.java 代码:

package com.xl.test;


import com.xl.test.model.Weather;

import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by hushendian on 2017/7/20.
 */

public interface APIService {
   /**
     * 结合使用RxJAVA2
     *
     * @param cityid
     * @param key
     * @return
     */
    @GET("weather?")
    Observable<Weather> getWeather(@Query("cityid") String cityid, @Query("key") String key);
}

WeatherActivity.java 添加方法,直接调用即可:

 /**
     * Retrofit+Rxjava2   优点  省略回调直接使用
     */
    public void getMsg() {
        Log.d(TAG, "onNext: "+ retrofitManger.getService().getWeather("CN101040300",
 "e680b5cf2b0b4fc88bfe6bcee99f7c58"));
        retrofitManger.getService().getWeather("CN101040300", "e680b5cf2b0b4fc88bfe6bcee99f7c58")
                .compose
                        (RxObservableUtils.<Weather>applySchedulers()).subscribe(new
 Observer<Weather>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Weather weather) {

                showWeatherInfo(weather.getHeWeather().get(0));
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });

    }

Rxjava2+Retrofit+Nucleus

WeatherPresenter.java

public class WeatherPresenter extends RxPresenter<WeatherActivity> {
    public static final int REQUEST_ID = 1;

    RetrofitManger retrofitManger = RetrofitManger._getInstance();

    @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        Log.d("WeatherPresenter", "onCreate: " + "Presenter初始化");
        restartableLatestCache(REQUEST_ID, new Factory<Observable<Weather.HeadWeather>>() {
            @Override
            public Observable<Weather.HeadWeather> create() {
                return retrofitManger.getService().getWeather("CN101040300",
                        "e680b5cf2b0b4fc88bfe6bcee99f7c58").map(new Function<Weather, Weather
                        .HeadWeather>() {


                    @Override
                    public Weather.HeadWeather apply(Weather weather) throws Exception {
                        return weather.getHeWeather().get(0);
                    }
                }).compose(RxObservableUtils.<Weather.HeadWeather>applySchedulers());
            }
        }, new BiConsumer<WeatherActivity, Weather.HeadWeather>() {
            @Override
            public void accept(WeatherActivity weatherActivity, Weather.HeadWeather headWeather)
                    throws
                    Exception {
                weatherActivity.showWeatherInfo(headWeather);
            }
        }, new BiConsumer<WeatherActivity, Throwable>() {
            @Override
            public void accept(WeatherActivity weatherActivity, Throwable throwable) throws
                    Exception {
                weatherActivity.showErrormsg(throwable);
            }
        });


    }

    public void getMsg(){
        **start(REQUEST_ID);**
    }

}

RxObservableUtils.java 运行在主线程

package com.xl.test.util;


import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 * Created by hushendian on 2017/7/22.
 */

public class RxObservableUtils {

    //无进度的Schedulers
    public static <T> ObservableTransformer<T, T> applySchedulers() {


        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(Observable<T> upstream) {
                return upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers
                        .mainThread());
            }
        };
    }
}

BaseActivity.java:

package com.xl.test;

import android.os.Bundle;
import android.support.annotation.Nullable;

import nucleus5.view.NucleusAppCompatActivity;

/**
 * Created by hushendian on 2017/5/16.
 */

public abstract class BaseActivity extends NucleusAppCompatActivity<WeatherPresenter> {
    public static String TAG = "BaseActivity";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initView(savedInstanceState);
    }

    protected abstract void initView(Bundle savedInstanceState);

}
WeatherActivity.java :
**@RequiresPresenter(WeatherPresenter.class)**
public class WeatherActivity extends BaseActivity{
  @Override
    protected void initView(Bundle bundle) {
              getPresenter().getMsg();//启动
    }
}

运行效果图:
这里写图片描述
github地址: https://github.com/hushendian/WeatherDemo.git
感谢郭霖大神的数据接口。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值