zoukankan      html  css  js  c++  java
  • Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856
    本文出自【赵彦军的博客】

    在插件开发过程中,我们按照开发一个正式的项目来操作,需要整理一些常用工具类。

    Http 请求封装

    在插件的项目中,我们看到依赖库如下图所示:

    这里写图片描述

    • 在依赖包中,我们可以看到插件中是用了 httpClient 作为 http 底层连接库,做过 Android 开发的同学对 httpClient 库应该很熟悉,在早期的Android开发中,我们都用 httpClient 做 http 请求,后来被Android 废弃了。

    • 另外,在这里的 Json 解析用的 Gson , 是谷歌官方出品的 Json 解析框架。

    下面我们总结一个 HttpManager 以满足日常的插件开发需求,HttpManager 目前满足的功能有

    • Get 请求
    HttpManager.getInstance().get(String url) ;
    
    HttpManager.getInstance().get(String url, Map<String, String> params) ;
            
    
    • Post 请求
    HttpManager.getInstance().post(String url, Map<String, String> requestParams) ;
    
    • 下载文件
    HttpManager.getInstance().downloadFile(String url, String destFileName);
    

    如果我们需要其他的网络服务,可以自行搜索 Httpclient 的其他功能。

    HttpManager 源码如下所示:

    package com.http;
    
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    
    import java.io.*;
    import java.net.URI;
    import java.net.URLEncoder;
    import java.util.*;
    
    public class HttpManager {
    
        private static HttpManager ourInstance = new HttpManager();
    
        public static HttpManager getInstance() {
            return ourInstance;
        }
    
        private HttpManager() {
    
        }
    
        /**
         * POST请求
         *
         * @param url
         * @param requestParams
         * @return
         * @throws Exception
         */
        public String post(String url, Map<String, String> requestParams) throws Exception {
            String result = null;
            CloseableHttpClient httpClient = HttpClients.createDefault();
            /**HttpPost*/
            HttpPost httpPost = new HttpPost(url);
            List params = new ArrayList();
            Iterator<Map.Entry<String, String>> it = requestParams.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, String> en = it.next();
                String key = en.getKey();
                String value = en.getValue();
                if (value != null) {
                    params.add(new BasicNameValuePair(key, value));
                }
            }
            httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
            /**HttpResponse*/
            CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
            try {
                HttpEntity httpEntity = httpResponse.getEntity();
                result = EntityUtils.toString(httpEntity, "utf-8");
                EntityUtils.consume(httpEntity);
            } finally {
                try {
                    if (httpResponse != null) {
                        httpResponse.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
    
        }
    
        /**
         * GET 请求
         *
         * @param url
         * @param params
         * @return
         */
        public String get(String url, Map<String, String> params) {
            return get(getUrlWithQueryString(url, params));
        }
    
        /**
         * Get 请求
         *
         * @param url
         * @return
         */
        public String get(String url) {
            CloseableHttpClient httpCient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet();
            httpGet.setURI(URI.create(url));
    
            String result = null;
    
            //第三步:执行请求,获取服务器发还的相应对象
            CloseableHttpResponse httpResponse = null;
            try {
                httpResponse = httpCient.execute(httpGet);
                if (httpResponse.getStatusLine().getStatusCode() == 200) {
                    HttpEntity entity = httpResponse.getEntity();
                    String response = EntityUtils.toString(entity, "utf-8");//将entity当中的数据转换为字符串
                    result = response.toString();
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (httpResponse != null) {
                    try {
                        httpResponse.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
            return result;
        }
    
        /**
         * 根据api地址和参数生成请求URL
         *
         * @param url
         * @param params
         * @return
         */
        private String getUrlWithQueryString(String url, Map<String, String> params) {
            if (params == null) {
                return url;
            }
    
            StringBuilder builder = new StringBuilder(url);
            if (url.contains("?")) {
                builder.append("&");
            } else {
                builder.append("?");
            }
    
            int i = 0;
            for (String key : params.keySet()) {
                String value = params.get(key);
                if (value == null) { //过滤空的key
                    continue;
                }
    
                if (i != 0) {
                    builder.append('&');
                }
    
                builder.append(key);
                builder.append('=');
                builder.append(encode(value));
    
                i++;
            }
    
            return builder.toString();
        }
    
        /**
         * 下载文件
         *
         * @param url
         * @param destFileName
         * @throws ClientProtocolException
         * @throws IOException
         */
        public boolean downloadFile(String url, String destFileName) {
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpGet httpget = new HttpGet(url);
            HttpResponse response = null;
            InputStream in = null;
            try {
                response = httpclient.execute(httpget);
                HttpEntity entity = response.getEntity();
                in = entity.getContent();
                File file = new File(destFileName);
    
                FileOutputStream fout = new FileOutputStream(file);
                int l = -1;
                byte[] tmp = new byte[1024];
                while ((l = in.read(tmp)) != -1) {
                    fout.write(tmp, 0, l);
                }
                fout.flush();
                fout.close();
    
                return true;
    
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭低层流。
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                try {
                    httpclient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
    
    
        /**
         * 进行URL编码
         *
         * @param input
         * @return
         */
        private String encode(String input) {
            if (input == null) {
                return "";
            }
    
            try {
                return URLEncoder.encode(input, "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            return input;
        }
    }
    
    

    Json 解析封装

    根据 Gson 库进行封装,具体用法如下:

    • json字符串转对象
      JsonUtil.fromJson(String json, Class<T> classOfT)
    
    • 对象转json字符串
     JsonUtil.toJson(Object src);
             
    

    JsonUtil 源码如下:

    package com.util;
    
    import com.google.gson.Gson;
    
    public class JsonUtil {
    
        static Gson gson = new Gson() ;
    
        /**
         * json字符串转对象
         * @param json
         * @param classOfT
         * @param <T>
         * @return
         */
        public static <T>T fromJson(String json, Class<T> classOfT){
            return gson.fromJson(json,classOfT);
        }
    
        /**
         * 对象转json字符串
         * @param src
         * @return
         */
        public static String toJson(Object src){
           return gson.toJson(src);
        }
        
    }
    
    

    Log 日志

    Logger 类源码

    package com.util;
    
    import com.intellij.notification.*;
    
    /**
     * logger
     * Created by zhaoyanjun on 15/11/27.
     */
    public class Logger {
        private static String NAME;
        private static int LEVEL = 0;
    
        public static final int DEBUG = 3;
        public static final int INFO = 2;
        public static final int WARN = 1;
        public static final int ERROR = 0;
    
        public static void init(String name,int level) {
            NAME = name;
            LEVEL = level;
            NotificationsConfiguration.getNotificationsConfiguration().register(NAME, NotificationDisplayType.NONE);
        }
    
        public static void debug(String text) {
            if (LEVEL >= DEBUG) {
                Notifications.Bus.notify(
                        new Notification(NAME, NAME + " [DEBUG]", text, NotificationType.INFORMATION));
            }
        }
    
        public static void info(String text) {
            if (LEVEL > INFO) {
                Notifications.Bus.notify(
                        new Notification(NAME, NAME + " [INFO]", text, NotificationType.INFORMATION));
            }
        }
    
        public static void warn(String text) {
            if (LEVEL > WARN) {
                Notifications.Bus.notify(
                        new Notification(NAME, NAME + " [WARN]", text, NotificationType.WARNING));
            }
        }
    
        public static void error(String text) {
            if (LEVEL > ERROR) {
                Notifications.Bus.notify(
                        new Notification(NAME, NAME + " [ERROR]", text, NotificationType.ERROR));
            }
        }
    }
    
    

    使用

    //初始化
    Logger.init("zhao" , Logger.DEBUG);
    
    //打印 debug 信息
    Logger.debug("i am a debug");
    
    //打印info信息
    Logger.info("i am a info");
    
    //打印warn信息
    Logger.warn("i am a warn");
    
    //打印error信息
    Logger.error("i am a error");
    

    在 Android Studio 里效果如下

    这里写图片描述

    下一篇:Android Studio 插件开发详解三:翻译插件实战


    个人微信号:zhaoyanjun125 , 欢迎关注

  • 相关阅读:
    Qt之数据类型转换
    [leetcode] Sudoku Solver
    调用摄像头拍照实例,摇一摇实例
    html 标签
    JavaScript 常见的六种继承方式
    js的DOM的方法和属性总结
    BOM属性方法。
    DOM 元素对象的属性方法
    完整的用户代理字符串检测
    可以跨浏览器获得窗口左边,和上边的位置
  • 原文地址:https://www.cnblogs.com/zhaoyanjun/p/7814929.html
Copyright © 2011-2022 走看看