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
感谢郭霖大神的数据接口。