1.OkHttpHelper
package cniao5.com.cniao5shop.http;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.JsonParseException;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class OkHttpHelper {
public static final String TAG="OkHttpHelper";
private static OkHttpHelper mInstance;
private OkHttpClient mHttpClient;
private Gson mGson;
private Handler mHandler;
static {
mInstance = new OkHttpHelper();
}
private OkHttpHelper(){
mHttpClient = new OkHttpClient();
mHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);
mHttpClient.setReadTimeout(10,TimeUnit.SECONDS);
mHttpClient.setWriteTimeout(30,TimeUnit.SECONDS);
mGson = new Gson();
mHandler = new Handler(Looper.getMainLooper());
};
public static OkHttpHelper getInstance(){
return mInstance;
}
public void get(String url,BaseCallback callback){
Request request = buildGetRequest(url);
request(request,callback);
}
public void post(String url,Map<String,String> param, BaseCallback callback){
Request request = buildPostRequest(url,param);
request(request,callback);
}
public void request(final Request request,final BaseCallback callback){
callback.onBeforeRequest(request);
mHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
callback.onFailure(request,e);
}
@Override
public void onResponse(Response response) throws IOException {
callback.onResponse(response);
if(response.isSuccessful()) {
String resultStr = response.body().string();
Log.d(TAG, "result=" + resultStr);
if (callback.mType == String.class){
callbackSuccess(callback,response,resultStr);
}
else {
try {
Object obj = mGson.fromJson(resultStr, callback.mType);
callbackSuccess(callback,response,obj);
}
catch (com.google.gson.JsonParseException e){ // Json解析的错误
callback.onError(response,response.code(),e);
}
}
}
else {
callbackError(callback,response,null);
}
}
});
}
private void callbackSuccess(final BaseCallback callback , final Response response, final Object obj ){
//变为主线程
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onSuccess(response, obj);
}
});
}
private void callbackError(final BaseCallback callback , final Response response, final Exception e ){
mHandler.post(new Runnable() {
@Override
public void run() {
callback.onError(response,response.code(),e);
}
});
}
private Request buildPostRequest(String url,Map<String,String> params){
return buildRequest(url,HttpMethodType.POST,params);
}
private Request buildGetRequest(String url){
return buildRequest(url,HttpMethodType.GET,null);
}
//构建Request对象 区分POST和GET
private Request buildRequest(String url,HttpMethodType methodType,Map<String,String> params){
Request.Builder builder = new Request.Builder()
.url(url);
if (methodType == HttpMethodType.POST){
RequestBody body = builderFormData(params);
builder.post(body);
}
else if(methodType == HttpMethodType.GET){
builder.get();
}
return builder.build();
}
private RequestBody builderFormData(Map<String,String> params){
FormEncodingBuilder builder = new FormEncodingBuilder();
if(params !=null){
for (Map.Entry<String,String> entry :params.entrySet() ){
builder.add(entry.getKey(),entry.getValue());
}
}
return builder.build();
}
enum HttpMethodType{
GET,
POST,
}
}
2.回调(不含对话框)
package cniao5.com.cniao5shop.http;
import com.google.gson.internal.$Gson$Types;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public abstract class BaseCallback <T> {
public Type mType;
//把T转换成Type
static Type getSuperclassTypeParameter(Class<?> subclass)
{
Type superclass = subclass.getGenericSuperclass();
if (superclass instanceof Class)
{
throw new RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
public BaseCallback()
{
mType = getSuperclassTypeParameter(getClass());
}
public abstract void onBeforeRequest(Request request);
public abstract void onFailure(Request request, Exception e) ;
/**
*请求成功时调用此方法
* @param response
*/
public abstract void onResponse(Response response);
/**
*
* 状态码大于200,小于300 时调用此方法
* @param response
* @param t
* @throws IOException
*/
public abstract void onSuccess(Response response,T t) ;
/**
* 状态码400,404,403,500等时调用此方法
* @param response
* @param code
* @param e
*/
public abstract void onError(Response response, int code,Exception e) ;
}
3.回调(含对话框)-----继承BaseCallBack
使用的对话框:spots-dialog :github
compile 'com.github.d-max:spots-dialog:0.4@aar'
package cniao5.com.cniao5shop.http;
import android.content.Context;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import dmax.dialog.SpotsDialog;
//含有对话框的Callback
public abstract class SpotsCallBack<T> extends BaseCallback<T> {
private Context mContext;
private SpotsDialog mDialog;
public SpotsCallBack(Context context){
mContext = context;
initSpotsDialog();
}
private void initSpotsDialog(){
mDialog = new SpotsDialog(mContext,"拼命加载中...");
}
public void showDialog(){
mDialog.show();
}
public void dismissDialog(){
mDialog.dismiss();
}
public void setLoadMessage(int resId){
mDialog.setMessage(mContext.getString(resId));
}
@Override
public void onFailure(Request request, Exception e) {
dismissDialog();
}
@Override
public void onBeforeRequest(Request request) {
showDialog();
}
@Override
public void onResponse(Response response) {
dismissDialog();
}
}
5.使用
package cniao5.com.cniao5shop.fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.daimajia.slider.library.Animations.DescriptionAnimation;
import com.daimajia.slider.library.Indicators.PagerIndicator;
import com.daimajia.slider.library.SliderLayout;
import com.daimajia.slider.library.SliderTypes.BaseSliderView;
import com.daimajia.slider.library.SliderTypes.DefaultSliderView;
import com.daimajia.slider.library.SliderTypes.TextSliderView;
import com.daimajia.slider.library.Tricks.ViewPagerEx;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import cniao5.com.cniao5shop.R;
import cniao5.com.cniao5shop.adapter.DividerItemDecortion;
import cniao5.com.cniao5shop.adapter.HomeCatgoryAdapter;
import cniao5.com.cniao5shop.bean.Banner;
import cniao5.com.cniao5shop.bean.HomeCategory;
import cniao5.com.cniao5shop.http.BaseCallback;
import cniao5.com.cniao5shop.http.OkHttpHelper;
import cniao5.com.cniao5shop.http.SpotsCallBack;
/**
* Created by Ivan on 15/9/25.
*/
public class HomeFragment extends Fragment {
private SliderLayout mSliderLayout;
// private PagerIndicator indicator;
private RecyclerView mRecyclerView;
private HomeCatgoryAdapter mAdatper;
private static final String TAG="HomeFragment";
private Gson mGson = new Gson();
private List<Banner> mBanner;
private OkHttpHelper httpHelper = OkHttpHelper.getInstance();
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home,container,false);
mSliderLayout = (SliderLayout) view.findViewById(R.id.slider);
// indicator= (PagerIndicator) view.findViewById(R.id.custom_indicator);
requestImages();
initRecyclerView(view);
return view;
}
private void requestImages(){
String url ="http://112.124.22.238:8081/course_api/banner/query?type=1";
//
//
// OkHttpClient client = new OkHttpClient();
//
// RequestBody body = new FormEncodingBuilder()
// .add("type","1")
//
// .build();
//
//
// Request request = new Request.Builder()
// .url(url)
// .post(body)
// .build();
//
//
//
// client.newCall(request).enqueue(new Callback() {
// @Override
// public void onFailure(Request request, IOException e) {
//
//
// }
//
// @Override
// public void onResponse(Response response) throws IOException {
//
// if(response.isSuccessful()){
//
// String json = response.body().string();
//
// Type type = new TypeToken<List<Banner>>(){}.getType();
// mBanner = mGson.fromJson(json,type);
//
// initSlider();
//
//
// }
// }
// });
httpHelper.get(url, new SpotsCallBack<List<Banner>>(getContext()){
@Override
public void onSuccess(Response response, List<Banner> banners) {
mBanner = banners;
initSlider();
}
@Override
public void onError(Response response, int code, Exception e) {
}
});
}
private void initRecyclerView(View view) {
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);
List<HomeCategory> datas = new ArrayList<>(15);
HomeCategory category = new HomeCategory("热门活动",R.drawable.img_big_1,R.drawable.img_1_small1,R.drawable.img_1_small2);
datas.add(category);
category = new HomeCategory("有利可图",R.drawable.img_big_4,R.drawable.img_4_small1,R.drawable.img_4_small2);
datas.add(category);
category = new HomeCategory("品牌街",R.drawable.img_big_2,R.drawable.img_2_small1,R.drawable.img_2_small2);
datas.add(category);
category = new HomeCategory("金融街 包赚翻",R.drawable.img_big_1,R.drawable.img_3_small1,R.drawable.imag_3_small2);
datas.add(category);
category = new HomeCategory("超值购",R.drawable.img_big_0,R.drawable.img_0_small1,R.drawable.img_0_small2);
datas.add(category);
mAdatper = new HomeCatgoryAdapter(datas);
mRecyclerView.setAdapter(mAdatper);
mRecyclerView.addItemDecoration(new DividerItemDecortion());
mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
}
private void initSlider(){
if(mBanner !=null){
for (Banner banner : mBanner){
TextSliderView textSliderView = new TextSliderView(this.getActivity());
textSliderView.image(banner.getImgUrl());
textSliderView.description(banner.getName());
textSliderView.setScaleType(BaseSliderView.ScaleType.Fit);
mSliderLayout.addSlider(textSliderView);
}
}
mSliderLayout.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);
mSliderLayout.setCustomAnimation(new DescriptionAnimation());
mSliderLayout.setPresetTransformer(SliderLayout.Transformer.RotateUp);
mSliderLayout.setDuration(3000);
mSliderLayout.addOnPageChangeListener(new ViewPagerEx.OnPageChangeListener() {
@Override
public void onPageScrolled(int i, float v, int i1) {
Log.d(TAG,"onPageScrolled");
}
@Override
public void onPageSelected(int i) {
Log.d(TAG,"onPageSelected");
}
@Override
public void onPageScrollStateChanged(int i) {
Log.d(TAG,"onPageScrollStateChanged");
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
mSliderLayout.stopAutoCycle();
}
}
——————————————————————————————————————————————————————
1.回调方法的使用
(1)A暴露回调接口给B,在接口中实现抽象方法,具体实现由B来做,什么时候调用由A来做