Android Studio 插件开发详解二:工具类
来源:互联网 发布:三剑客软件下载 编辑:程序博客网 时间:2024/05/21 00:20
转载请标明出处: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 , 欢迎关注
阅读全文
0 0
- Android Studio 插件开发详解二:工具类
- Android Studio开发工具详解
- 开发工具&插件 Android Studio FindBugs插件提示信息说明
- Android Studio 插件(二)
- Android Studio 插件开发详解三:翻译插件实战
- android studio 插件推荐和android开发效率工具推荐
- 非常有用的开发工具之Android Studio插件
- 非常有用的开发工具之Android Studio插件
- Android Studio插件开发
- Android Studio 插件开发
- Android Studio插件和工具
- Android开发工具--Android studio开发常用插件和工具
- android studio 开发工具
- android studio开发工具
- Android Studio(开发工具)
- Android Studio 插件开发详解一:入门练手
- Android Studio 插件开发详解四:填坑
- Android Studio开发工具学习篇章二----Gradle的学习
- 数据结构实验之栈与队列四:括号匹配
- 鼠标离开事件集
- Linux学习(二十一):线程
- ORA-12519: TNS:no appropriate service handler found 解决
- aa
- Android Studio 插件开发详解二:工具类
- Javascript闭包(Closure)理解
- pom文件报错web.xml is missing and <failOnMissingWebXml> is set to true
- Python初步实现车道线检测
- 测试用例设计技巧
- Object Detection系列(一) R-CNN
- GKGraph
- Bootstrap中点击后禁用按钮的最佳方法
- 常见注册