频道栏目
首页 > 资讯 > 其他 > 正文

移动开发网络请求框架解析

18-06-04        来源:[db:作者]  
收藏   我要投稿
1、网络抽象层接口
package lwl.tianyao.httpproject;

import java.util.Map;

/**
 * 网络抽象层接口
 */

public interface IHttpProcessor {

 void post(String url,Map params,final HttpCallback callback);

 void get(String url,Map params,final HttpCallback callback);
}

2、回调接口

package lwl.tianyao.httpproject;

/**
 * 回调接口
 */
public interface ICallback {

 void onSuccess(String result);

 void onFailure(String e);
}

3、HttpHelper

package lwl.tianyao.httpproject;

import java.net.URLEncoder;
import java.util.Map;

public class HttpHelper implements IHttpProcessor {

 private static HttpHelper instance;

 private HttpHelper(){

 }

 public static HttpHelper obtain(){
  synchronized (HttpHelper.class){
if(instance==null){
 instance=new HttpHelper();
}
  }
  return instance;
 }


 private static IHttpProcessor mHttpProcessor = null;

 public static void init(IHttpProcessor httpProcessor){
  mHttpProcessor = httpProcessor;
 }


 @Override
 public void post(String url, Map params, HttpCallback callback) {
  final String finalUrl = appendParams(url,params);
  mHttpProcessor.post(finalUrl,params,callback);
 }

 @Override
 public void get(String url, Map params, HttpCallback callback) {
  mHttpProcessor.post(url,params,callback);
 }

 public static String appendParams(String url,Map params){
  if(params ==null || params.isEmpty()){
return url;
  }

  StringBuilder urlBuilder = new StringBuilder(url);
  if(urlBuilder.indexOf("?")<=0){
urlBuilder.append("?");
  }else {
if(!urlBuilder.toString().endsWith("?")){
 urlBuilder.append("&");
}
  }

  for(Map.Entry entry:params.entrySet()){
urlBuilder.append("&"+entry.getKey()).append("=").append(encode(entry.getValue().toString()));

  }
  return urlBuilder.toString();
 }
 private static String encode(String str){
  try {
return URLEncoder.encode(str,"utf-8");
  }catch (Exception e){
e.printStackTrace();
throw new RuntimeException();
  }
 }

}

4、回调接口的实现

package lwl.tianyao.httpproject;

import com.google.gson.Gson;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 *  回调接口的实现
 *  1.必须想办法得到Result
 *  2.用户把返回string转换成调用层传入的参数化类型 Result
 */
public abstract class HttpCallback implements ICallback{

 @Override
 public void onSuccess(String result) {
  Gson gson = new Gson();
  Class clz =analysisClassInfo(this);
  Result objResult= (Result) gson.fromJson(result,clz);
  //objResult传回调用者
  onSuccess(objResult);

 }

 public abstract void onSuccess(Result result);


 private static Class analysisClassInfo(Object object){
  //getGenericSuperclass可以得到包含原始类型,参数化类型,数据类型,类型变量。
  Type genType = object.getClass().getGenericSuperclass();
  //获取参数化类型()
  Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
  return (Class) params[0];

 }

 @Override
 public void onFailure(String e) {

 }
}

5、volley框架VolleyProcessor

package lwl.tianyao.httpproject;

import android.content.Context;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.Map;

public class VolleyProcessor implements IHttpProcessor {

 private static RequestQueue mQueue = null;

 public VolleyProcessor(Context context){
  mQueue = Volley.newRequestQueue(context);
 }

 @Override
 public void post(String url, Map params, final HttpCallback callback) {
  StringRequest stringRequest=new StringRequest(Request.Method.POST, url, new Response.Listener() {
@Override
public void onResponse(String response) {
 callback.onSuccess(response);
}
  }, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
 callback.onFailure(error.toString());
}
  });
  mQueue.add(stringRequest);
 }

 @Override
 public void get(String url, Map params, HttpCallback callback) {

 }
}

6、全局上下文初始化

package lwl.tianyao.httpproject;

import android.app.Application;

public class MyApplication extends Application {

 @Override
 public void onCreate() {
  super.onCreate();
  //HttpHelper.init(new VolleyProcessor(this));
  //HttpHelper.init(new XUtilsProcessor(this));
  HttpHelper.init(new OkHttpProcessor());
 }
}
7、Activity页面请求
package lwl.tianyao.httpproject;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Toast;

import java.util.HashMap;
import java.util.Map;

public class MyActivity extends Activity {

 String url = "http://v.juhe.cn/weather/index";
 Map params = new HashMap<>();

 @Override
 protected void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  params.put("cityname","长沙");
  params.put("key","123456");

 }

 public void click(View view){

  HttpHelper.obtain().post(url, params, new HttpCallback(){

@Override
public void onSuccess(ResultBean resultBean) {
 Toast.makeText(MyActivity.this,resultBean.getReason(),Toast.LENGTH_SHORT).show();
}
  });
 }
}

8、其他网络框架

package lwl.tianyao.httpproject;

import org.xutils.common.Callback;
import org.xutils.http.RequestParams;
import org.xutils.x;

import java.util.Map;

public class XUtilsProcessor implements IHttpProcessor{

 public XUtilsProcessor(MyApplication app){
  x.Ext.init(app);
 }

 @Override
 public void post(String url, Map params, final HttpCallback callback) {
  RequestParams requestParams  = new RequestParams(url);
  x.http().post(requestParams, new Callback.CommonCallback() {
@Override
public void onSuccess(String result) {
 callback.onSuccess(result);
}

@Override
public void onError(Throwable ex, boolean isOnCallback) {
 callback.onFailure(ex.getMessage());
}

@Override
public void onCancelled(CancelledException cex) {

}

@Override
public void onFinished() {

}
  });
 }

 @Override
 public void get(String url, Map params, HttpCallback callback) {

 }
}
package lwl.tianyao.httpproject;

import android.os.Handler;

import java.io.IOException;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttpProcessor implements IHttpProcessor{

 private OkHttpClient mOkHttpClient;
 private Handler myHandler =null;

 public OkHttpProcessor(){
  mOkHttpClient= new OkHttpClient();
  myHandler= new Handler();
 }

 @Override
 public void post(String url, Map params, final HttpCallback callback) {
  final RequestBody requestBody = appendBody(params);
  Request request = new Request.Builder()
 .url(url)
 .post(requestBody)
 .build();
  mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
 callback.onFailure(e.getMessage().toString());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
 if(response.isSuccessful()){
  final String result = response.body().string();
  myHandler.post(new Runnable() {
@Override
public void run() {
 callback.onSuccess(result);
}
  });
 }else {
  final String result = response.body().string();
  myHandler.post(new Runnable() {
@Override
public void run() {
 callback.onFailure(result);
}
  });
 }
}
  });
 }

 private RequestBody appendBody(Map params){
  FormBody.Builder body = new FormBody.Builder();
  if(params==null || params.isEmpty()){
return body.build();
  }
  for(Map.Entry entry:params.entrySet()){
body.add(entry.getKey(),entry.getValue().toString());
  }
  return body.build();
 }

 @Override
 public void get(String url, Map params, HttpCallback callback) {

 }
}
相关TAG标签
上一篇:移动开发SpUtil使用方法
下一篇:vmware下ubantu18的配置和软件安装步骤教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站