以前的项目网络连接那块一直坚持使用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 }