Android Studio 插件开发详解二:工具类
生活随笔
收集整理的這篇文章主要介紹了
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 請求
- Post 請求
- 下載文件
如果我們需要其他的網絡服務,可以自行搜索 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) { //過濾空的keycontinue;}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字符串轉對象
- 對象轉json字符串
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 , 歡迎關注
總結
以上是生活随笔為你收集整理的Android Studio 插件开发详解二:工具类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CENTOS6.3下zabbix安装部署
- 下一篇: android sina oauth2.