网络访问框架经过了从使用最原始的AsyncTask构建简单的网络访问框架(甚至不能称为框架),后来使用开源的Android-async-http库,再到使用google发布的volley库,一直不懈的寻找更好的解决方案(银弹),到现在虽然银弹没找到,也算找 到了一些更好的方案,在这里做些记录,也做共享。
Retrofit是一套RESTful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),
POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装》
你可以根据以下地址进行下载 Retrofit:
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.0.2</version>
</dependency>
or Gradle:
compile 'com.squareup.retrofit2:retrofit:2.0.2'
1.首先我们来看下Retrofit 的大体架构:
2.废话不多说我们上代码吧!
首先是初始化单例 Retrofit 工具类:
import android.content.Context; import android.support.design.widget.Snackbar; import android.util.Log; import android.view.View; import android.widget.Toast; import com.example.administrator.myapplication.factory.JsonConverterFactory; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; /** * Created by gxj on 2015/12/16. */ public class RetrofitSingleton { private static ApiInterface apiService = null; private static Retrofit retrofit = null; private static OkHttpClient okHttpClient = null; private static final String TAG = RetrofitSingleton.class.getSimpleName(); public static Context context; /** * 初始化 */ public static void init(final Context context) { Executor executor = Executors.newCachedThreadPool(); Gson gson = new GsonBuilder().create(); retrofit = new Retrofit.Builder() .addConverterFactory(JsonConverterFactory.create()) // .addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl(ApiInterface.HOST) .callbackExecutor(executor) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); apiService = retrofit.create(ApiInterface.class); } public static ApiInterface getApiService(Context context) { if (apiService != null) return apiService; init(context); return getApiService(context); } public static Retrofit getRetrofit(Context context) { if (retrofit != null) return retrofit; init(context); return getRetrofit(context); } public static OkHttpClient getOkHttpClient(Context context) { if (okHttpClient != null) return okHttpClient; init(context); return getOkHttpClient(context); } public static void disposeFailureInfo(Throwable t, Context context, View view) { if (t.toString().contains("GaiException") || t.toString().contains("SocketTimeoutException") || t.toString().contains("UnknownHostException")) { Snackbar.make(view, "网络不好,~( ´•︵•` )~", Snackbar.LENGTH_LONG).show(); } else { Toast.makeText(context, t.getMessage(), Toast.LENGTH_LONG).show(); } Log.w(TAG, t.toString()); } }
2.Retrofit get 请求:
这是接口的配置 ,相当的简单。
@GET("http://gank.io/api/day/2016/4/{day}") Observable<String> mGetAPI(@Path("day") int day);;
接下来是请求代码的正式实现:
private void get() { Observer observer = new Observer<String>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { tv_content.setText("onError"+e.getMessage()); } @Override public void onNext(String weather) { tv_content.setText("onNext"+weather); } }; RetrofitSingleton.getApiService(getActivity()) .mGetAPI() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnNext(new Action1<String>() { @Override public void call(String weather) { // aCache.put("WeatherData", weather, // (mSetting.getInt(Setting.AUTO_UPDATE, 0) + 1) * Setting.ONE_HOUR);//默认一小时后缓存失效 } }) .subscribe(observer); }
3. 接下来让我看看 Retrofit post 请求的实现过程,配置也是超级简单:
@POST("/") Observable<String> mGetLoginAPI(@Query("username") String username, @Query("password") String password);
这是post 请求的具体实现:
private void post() { Observer observer = new Observer<String>() { @Override public void onCompleted() { DebugUtil.i("gxj", "onCompleted" ); } @Override public void onError(Throwable e) { DebugUtil.i("gxj", "onError" + e); } @Override public void onNext(String weather) { DebugUtil.i("gxj", weather); } }; RetrofitSingleton.getApiService(getActivity()) .mGetLoginAPI( "18516590402", "yy0402") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); }
看了以上的代码相信大家对Retrofit 深有感触吧! 本例子 还结合了 当下最流行的响应式开发框架 RXjava ,让代码的异步请求完全解放。剩下的让大家细细去品味代码的魅力去吧!
如果大家在看代码的当中有什么不懂得可以发邮件给我;我会尽快给出相应的解答!
我的邮箱地址:1258624735@qq.com:
ps: 如果大家觉得文章对你有帮助:不妨大赏一下支持原创,你的支持是我最大的动力: