美文网首页
Andriod网络处理

Andriod网络处理

作者: 木头与琉璃 | 来源:发表于2018-04-16 19:41 被阅读15次

网络请求:okhttp使用

  • 第三方库okhttp的引入


    okhttp的引入
  • post请求

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();
         }
}
  • 注意点
    1.网络请求要放在异步线程处理
    2.要在AndirodMainifest中声明允许网络权限


    网络权限

异步处理:AnsyncTask使用

参考文档

    class MyAsyncTask extends AsyncTask<Integer,Integer, String>{
        @Override
        //重写doInBackground方法,在该方法中处理要处理的异步请求
        protected String doInBackground(Integer... integers) {
            return login(email,pwd);
        }
    }
  • 在子线程上进行数据请求,在UI线程上刷新UI
    // 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); //反序列化

相关文章

网友评论

      本文标题:Andriod网络处理

      本文链接:https://www.haomeiwen.com/subject/bjaekftx.html