Andriod网络处理

2018-04-16  本文已影响15人  木头与琉璃

网络请求:okhttp使用

1.入参格式声明

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

2.请求实现

//url: 请求链接 , json:入参json字符串
String run(String url, String json) {
        //1.声明http请求管理类
        OkHttpClient client = new OkHttpClient();
        //2.声明入参
        RequestBody body = RequestBody.create(JSON, json);
        //3.声明请求
        Request request = new Request.Builder().url(url).post(body).build();
         try {
             //4.发送请求,接受响应
             Response response = client.newCall(request).execute();
             return  response.body().string();
         } catch (IOException e) {
             return e.toString();
         }
}

异步处理:AnsyncTask使用

参考文档

    class MyAsyncTask extends AsyncTask<Integer,Integer, String>{
        @Override
        //重写doInBackground方法,在该方法中处理要处理的异步请求
        protected String doInBackground(Integer... integers) {
            return login(email,pwd);
        }
    }
    // 0.定义接口
    public interface OnTaskLisnten{
        void onSuccess(Context context, String result);
        void onFailure(Context context, String msg);
    }

    //1.定义Task
    class MyAsyncTask extends AsyncTask<Integer,Integer, String>{
        private String result;
        private OnTaskLisnten lisnten;
        private Context context;

        public MyAsyncTask(Context context, OnTaskLisnten listen){
            this.lisnten = listen;
            this.context = context;
        }

        @Override
        protected String doInBackground(Integer... integers) {
            result = login(email,pwd);
            return  result;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if (s.length() > 0){
                this.lisnten.onSuccess(context,s);
            }else {
                this.lisnten.onFailure(context, "请求失败,请稍后再试");
            }
        }
    }

  // 2.使用异步请求类
         email = emailText.getText().toString();
        pwd = pwdText.getText().toString();
        MyAsyncTask task = new MyAsyncTask(this, new OnTaskLisnten() {
            @Override
            public void onSuccess(Context context, String result) {    
            }
            @Override
            public void onFailure(Context context, String msg) {
            }
      });

入参序列化

将object对象转换为JSONObject,调用JSONObject的toString方法可以获取到json字符串

Map<String,String > param = new HashMap<String, String>();
param.put("email", email);
param.put("passwd", pwd);
JSONObject jsonParam = new JSONObject(param);
Log.e("test",jsonParam.toString());
String result = run("http://120.79.19.171:3021/Login/loginChecked", jsonParam.toString());

出参序列化(不包含嵌套(可以用递归处理))

方案1:出参json字符串 --》 JSONObject --> Map<String, Object>

        // 声明一个存储map
        Map<String, Object> responseDic = new HashMap<String , Object>();
        try {
            //  json字符串 --》JSONObject
            JSONObject object = new JSONObject(result);
           //  获取所有keys
            Iterator<String> keysIter = object.keys();
           // 遍历所有key,根据key取出相应的value值,然后存入map中
            while (keysIter.hasNext()){
                String key = keysIter.next();
                Object value = object.get(key);
                responseDic.put(key,value);
            }
            Log.e("test-1",responseDic.toString());
        }catch (Exception e){
            Log.e("test", "解析失败");
        }

方案二: fastjson

String text = JSON.toJSONString(obj); //序列化
VO vo = JSON.parseObject("{...}", VO.class); //反序列化
上一篇 下一篇

猜你喜欢

热点阅读