废话不多说下面我们进入主题。
说起Retrofit的话,我们可以借鉴Retrofit官方描述的一句话:“A type-safe HTTP client for Android and Java”。一个针对Android和Java类型安全的http客户端。下面是retrofit的学习链接:
官网地址:retrofit
github地址:retrofit
学习retrofit我们需要知道retrofit是做什么,怎么做。
对于Retrofit通俗的来讲就是一个用于Android和java的网络库,使用retrofit可以简化我们的网络操作,提高效率和正确率。它是Square公司开源的一个高质量高效率的http库,通过retrofit进行get、post等操作就只需要一行代码或者一个注解就可以搞定。
对于所有的网络通信,不管是volley还是okhttp,他的核心的任务就是:客户端与服务端进行数据的交互和操作。既然要进行数据的交互和操作,那么我们学习需要关注的点就出来了:
Retrofit的基本用法可以去阅读Retrofit基本用法和流程分析这里不做详解。
RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。概括的很精准但是具体是什么意思呢,其实说白了rajava可以归纳为异步,就是一个完成异步操作的库。这里就简单的说一下rxjava的概念,具体的了解大家可以参考两篇我认为写的比较好的博客来看:
抛物线大神的(主要对rxjava进行入门解读):
给 Android 开发者的 RxJava 详解
针对rxjava的观察者模式的详解:
给初学者的RxJava2.0教程
okhttp这里就不做过多的阐述了,下面我们来看具体的封装实现:
compile 'io.reactivex:rxjava:1.1.10'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.google.code.gson:gson:2.4'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.10.0'
public class LocalCilent {
private static String BASE_URL = "http://op.juhe.cn/robot/";
private static Retrofit retrofit = null;
private static OkHttpClient okHttpClient = null;
private static LocalCilent localCilent = null;
private LocalCilent() {
// retrofit = getRetrofit();
}
public static LocalCilent getInstance(){
if (localCilent == null){
synchronized (LocalCilent.class){
if (localCilent ==null){
localCilent = new LocalCilent();
}
}
}
return localCilent;
}
/**
* 重新设置baseUrl
* @param baseUrl 需要在调用create之前调用
* @return 当前对象
*/
public static LocalCilent setBaseUrl(String baseUrl) {
BASE_URL = baseUrl;
return localCilent;
}
//创建服务接口,不绑定生命周期
public T create(Class cla){
retrofit = getRetrofit();
return retrofit.create(cla);
}
//设置okhttpclient
private static OkHttpClient initOkHttpClient(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();//拦截器
interceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);//拦截头部信息
OkHttpClient httpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(interceptor)//设置头部拦截器
.retryOnConnectionFailure(true)
.readTimeout(Config.READ_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(Config.WRITE_TIMEOUT,TimeUnit.SECONDS)
.connectTimeout(Config.CONNECT_TIMEOUT,TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()//获取请求
.newBuilder()
.addHeader("source-terminal", "Android") //操作系统名称(注:ios、android)//设备型号
.addHeader("device-model", Build.MODEL) //设备型号
.addHeader("os-version", Build.VERSION.RELEASE)//操作系统版本号
.build();
Log.d("request",request.toString());
return chain.proceed(request);
}
}).build();
return httpClient;
}
//设置Retrofit,不带生命周期绑定的
protected static Retrofit getRetrofit(){
if (retrofit == null){
if (okHttpClient == null){
okHttpClient = initOkHttpClient();
}
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())//json转换器支持
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
/**
* 提供方法单独获取okhttpCilent
* @return okhttpCilent
*/
public OkHttpClient getOkHttpCilent(){
if(okHttpClient == null){
okHttpClient = initOkHttpClient();
}
return okHttpClient;
}
}
public interface ChatApi {
@GET("index")
Observable getchat(@Query("info") String info,@Query("key") String key,@Query("userid") String userid);
}
public class ChatPresenterImpl implements ChatPresenter {
private IChatView chatView;
public ChatPresenterImpl(IChatView chatView) {
this.chatView = chatView;
}
public void sendInfo(){
chatView.showDialog();
LocalCilent.getInstance()
.create(ChatApi.class)//创建请求
.getchat(chatView.getInfo(), Config.KEY, "1001")//请求参数
.subscribeOn(Schedulers.io())//指定被观察者的操作在io线程中完成
.observeOn(AndroidSchedulers.mainThread())// // 指定观察者接收到数据,然后在Main线程中完成
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.d("Info", "onCompleted: ");
chatView.hindDialog();
}
@Override
public void onError(Throwable e) {
Log.d("Info", "onError: " + e.getMessage());
chatView.hindDialog();
}
@Override
public void onNext(ChatBean chatBean) {
Log.d("Info", "onNext: " + chatBean.toString());
chatView.hindDialog();
chatView.clear();
}
});
}
}
public class ChatActivity extends BaseActivity implements View.OnClickListener,IChatView {
private EditText editTextInfo;
private TextView send;
//界面功能的具体实现(耗时操作)------网络请求
private ChatPresenter chatPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
}
/**
* 界面初始化操作
*/
@Override
public void initView() {
//自定义的findview来获取Id
editTextInfo = findView(R.id.info);
send = findView(R.id.send);
send.setOnClickListener(this);
}
/**
* 数据初始化操作
*/
@Override
public void initData() {
chatPresenter = new ChatPresenterImpl(this);
// showToast(NdkHelper.GetStringFromC());
}
/**
* 防止快速点击事件
* 这里没有使用,这是baseactivity里面封装的功能
* @param v
*/
@Override
public void widgetClick(View v) {
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.send:
chatPresenter.sendInfo();
break;
}
}
@Override
public void showDialog() {
loadingDialog.Dialogshow();
}
@Override
public void hindDialog() {
loadingDialog.DialogCancle();
}
@Override
public String getInfo() {
return editTextInfo.getText().toString();
}
@Override
public void flush() {
}
@Override
public void clear() {
editTextInfo.setText("");
}
@Override
public Activity getActivity() {
return this;
}
}
如果有什么不明白的或者文章中出现的问题可以随时留言给我欢迎指出。
转载请注明出处:http://blog.csdn.net/FlyingRookie/article/details/78248010
谢谢