以前的项目网络连接那块一直坚持使用HttpClient,总是会出现一些莫名奇妙的问题,现在新的项目使用了OKHttp网络框架,发现超级好用,上网再了解下,发现OkHttp口碑真的不错,对比之下HttpClient简直就是弱爆啦,今天就OKHttp post方式提交键值对的使用提出来,一者为了总结所学的知识,然后也是为了日后项目的偷懒,OKHttp的官方介绍地址,还有OKHttp的github源码,一开始我使用的是2.3的版本,post提交键值对也没啥问题,但是在图片上传方面遇到了bug怎么都解决不掉,再加上我这人喜新厌旧,一怒之下就把OKHttp的版本升到最高的3.4.1版本,升级之后发现变化特别大,在2.3版本中有的类和方法在3.4.1版本中根本就不存在啦,比如说FormEncodingBuilder()方法,真是没办法啦,只能找文档啦。
现在来说,还使用eclipse作为Android开发Android的童鞋,只能说你太怀旧啦,这里就不说eclipse怎么导入OKHttp啦,对于使用studio的童鞋来说,导入OKHttp特别简单,只需要在gradle中添加两行代码就行。
1 compile 'com.squareup.okhttp3:okhttp:3.4.1' 2 compile 'com.squareup.okio:okio:1.9.0'
我们可以在全局变量中初始化一个OKHttpClient并且配置一些比如连接时间的配置,我们就可以不用每向服务器请求一次数据就初始化一个OKHttpClient啦。
1 package com.example.keranbin.okhttpdemo; 2 3 import android.app.Application; 4 5 import java.io.File; 6 import java.util.concurrent.TimeUnit; 7 8 import okhttp3.Cache; 9 import okhttp3.OkHttpClient; 10 11 /** 12 * Created by keranbin on 2016/7/26. 13 */ 14 public class APP extends Application { 15 public static OkHttpClient okHttpClient; 16 public static APP app; 17 18 @Override 19 public void onCreate() { 20 super.onCreate(); 21 app=this; 22 } 23 24 public static OkHttpClient OkHttpInstance() { 25 if (okHttpClient == null) { 26 okHttpClient = new OkHttpClient().newBuilder() 27 .connectTimeout(500, TimeUnit.MILLISECONDS) 28 .readTimeout(1000,TimeUnit.MICROSECONDS) 29 .writeTimeout(1000,TimeUnit.MICROSECONDS) 30 .cache(new Cache(app.getExternalCacheDir(), 10 * 1024 * 1024)) 31 .build(); 32 return okHttpClient; 33 } else { 34 return okHttpClient; 35 } 36 } 37 }
我们不可能每请求一次数据就一个一个的往builder里面add个不停,想了下,干脆把这一块的代码提出来,调用的时候传个Map进来,一个for循环搞定,同时也把Handler传进来,那我们在Activity中不就直接可以操作请求回来的数据了吗。
1 package com.example.keranbin.okhttpdemo; 2 3 import android.os.Handler; 4 import android.os.Message; 5 import android.util.Log; 6 7 import java.io.IOException; 8 import java.util.Map; 9 10 import okhttp3.Call; 11 import okhttp3.Callback; 12 import okhttp3.FormBody; 13 import okhttp3.OkHttpClient; 14 import okhttp3.Request; 15 import okhttp3.RequestBody; 16 import okhttp3.Response; 17 18 /** 19 * Created by keranbin on 2016/7/26. 20 */ 21 public class HttpCon { 22 private static OkHttpClient okHttpClient =APP.OkHttpInstance(); 23 private static String URL = "http://10.11.5.229:8080/kqgl/ajax.mobileSword"; 24 /* 25 * @map 把参数都封装到map中 26 * @code 标志位,比如说handler的msg.what 27 * @handler 28 * */ 29 public static void Params(Map<String, Object> map, final int code, final Handler handler) { 30 31 Log.i("参数map",map.toString()); 32 33 FormBody.Builder builder = new FormBody.Builder(); 34 if (map != null) { 35 for (Map.Entry<String, Object> entry : map.entrySet()) { 36 Log.i("参数:" , entry.getKey() + ":" + entry.getValue()); 37 builder.add(entry.getKey(), entry.getValue().toString()); 38 } 39 } 40 RequestBody requestBody = builder.build(); 41 Request request = new Request.Builder().url(URL) 42 .header("Cache-Control", " max-stale=600") 43 .post(requestBody) 44 .build(); 45 46 okHttpClient.newCall(request).enqueue(new Callback() { 47 @Override 48 public void onFailure(Call call, IOException e) { 49 Log.i("网络错误" ,e.toString()); 50 } 51 52 @Override 53 public void onResponse(Call call, Response response) throws IOException { 54 String s = response.body().string().toString(); 55 Log.i("数据请求结果:" , s); 56 Message message = handler.obtainMessage(); 57 message.what = code; 58 message.obj = s; 59 handler.sendMessage(message); 60 } 61 62 }); 63 } 64 }
再看看MainActivity中怎么调用,把封装的Map,还有Code,Handler传过来就OK,就这么简单。
1 package com.example.keranbin.okhttpdemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.os.Handler; 6 import android.os.Message; 7 import android.widget.TextView; 8 import android.widget.Toast; 9 10 import java.util.HashMap; 11 import java.util.Map; 12 13 public class MainActivity extends Activity { 14 private Handler handler=new Handler(){ 15 @Override 16 public void handleMessage(Message msg) { 17 super.handleMessage(msg); 18 switch (msg.what){ 19 case 0x123: 20 Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show(); 21 break; 22 default: 23 break; 24 } 25 } 26 }; 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 setContentView(R.layout.activity_main); 32 Map map=new HashMap(); 33 //这里只是举个例子,具体的操作要视服务器端需要的数据哈 34 map.put("tid","KQ_XjjbglMobileCBS_getJbInitData"); 35 map.put("ryId","3423423243243243"); 36 HttpCon.Params(map,0x123,handler); 37 } 38 }