Android中当我们将界面写完后接下来的事情是什么? 当时是从服务器拉取数据,再给控件适配数据了;但是,请求的网络的框架一大堆,本人用过xUils,volley,HttpURLClient,Okhttp,okhttpUtils,现在在用retroift网络请求框架,个人觉得这个还是很牛逼的, 因为okhttp已经很厉害了, 而这个是对ok的再次升级;废话不多上,直接撸代码!!!
- 添加依赖(eclipse用户就不要围观了,洗洗碎)
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2'
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
2.定义请求接口
public interface NetService{
@GET("weather")
Call<Weather> loadeather(@Query("cityname") String cityname,@Query("key") String apiKey);
@GET("weather")
Call<Weather> load(@Query("cityname") String cityname,@Query("key") String apiKey);
// http://139.196.92.240/wapcenter/requesthome/homepage?hasAllFloor=false
@GET("homepage")
Observable<HomeTopBean> load(@Query("hasAllFloor") String b);
/**
* retrofit 支持 rxjava 整合
* 这种方法适用于新接口
*/
@GET("weather")
Observable<Weather> getWeatherData(@Query("cityname") String cityname, @Query("key") String apiKey);
@POST("user/哈哈")
Observable<Weather> post(@Field("name") String name, @Field("pwd") String pwd);
}
3.封装工具类
public class MyUtils {
public static OkHttpClient getOkHttpClient(Activity activity){
//设置缓存路径和大小
Cache cache = new Cache(activity.getCacheDir(),10*1024*1024);
//初始化OkHttpClient
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(5, TimeUnit.SECONDS);
client.setWriteTimeout(5, TimeUnit.SECONDS);
client.setReadTimeout(5, TimeUnit.SECONDS);
return client;
}
}
4.完整代码
public class Main2Activity extends AppCompatActivity {
//完整的url
// String url = "http://139.196.92.240/wapcenter/requesthome/homepage?hasAllFloor=false";
String baseUrl = "http://139.196.92.240/wapcenter/requesthome/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
OkHttpClient okHttpClient = MyUtils.getOkHttpClient(this);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
//这个方法必须有,这样才能返回含有数据的实体类
.addConverterFactory(GsonConverterFactory.create())
//要使用retroift和rexjava配合使用这个方法必须有,不然会报Unable to create call adapter
// for rx.Observable<com.ethanco.retrofit2_0test.HomeTopBean>异常
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)//整合ok
.build();
APIService apiService = retrofit.create(APIService.class);
Observable<HomeTopBean> observable = apiService.load("false");
observable.subscribeOn(Schedulers.io())//使请求网络的操作运行在子线程
.observeOn(AndroidSchedulers.mainThread())//使后面的subscribe运行在主线程
.subscribe(new Subscriber<HomeTopBean>() {
@Override
public void onCompleted() { //请求网络完成后回调,成功就只回调一次,失败不回调
System.out.println("completed");
}
@Override
public void onError(Throwable e) {//失败时回调
System.out.println("error");
}
@Override
public void onNext(HomeTopBean bean) {//成功时回调,这就是我们想要的;
System.out.println(bean);
}
});
}
}
//有网络 回调了onNext和onCompleted
//09-10 19:31:31.596 27341-27341/com.ethanco.retrofit2_0test I/System.out: HomeTopBean{errorMsg='',
//09-10 19:31:31.597 27341-27341/com.ethanco.retrofit2_0test I/System.out: completed
//没网或url有问题 第三行才是我后面运行的,前面2行是上面有网络时候的;(不造假,哈哈)
//09-10 19:31:31.596 27341-27341/com.ethanco.retrofit2_0test I/System.out: HomeTopBean{errorMsg='',
//09-10 19:31:31.597 27341-27341/com.ethanco.retrofit2_0test I/System.out: completed
//09-10 19:32:48.616 28986-28986/com.ethanco.retrofit2_0test I/System.out: error
last: 温馨提示,加了权限了吗? 亲
note: Retrofit+rxjava+okhttp博大精深, 后面有新的用法会加上去, 忘笑纳!!!
下集预告: 图片加载Glide