WebTool 網頁資訊獲取,可在主執行緒中呼叫
阿新 • • 發佈:2018-12-17
WebTool.java
package sci.tool; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import org.json.JSONObject; import sci.tool.ThreadTool.ThreadPram; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; /** WebTool.java: 網頁資訊獲取,可在主執行緒中呼叫 * * 1、byte[] GetBytes(final String url) * 2、String GetString(String dataUrl) * 3、JSONObject GetJSONObject(String jsonUrl) * 4、Bitmap GetBitmap(String imgUrl) * 5、Drawable GetDrawable(String imgUrl) * * ----- 2018-6-7 上午11:00:03 scimence */ public class WebTool { // 快取Drawable影象 private static HashMap<String, Drawable> DrawableDic = new HashMap<String, Drawable>(); /** 從網路上下載圖片,轉為Drawable */ public static Drawable GetDrawable(String imgUrl) { Drawable drawable = null; if (DrawableDic.containsKey(imgUrl)) drawable = DrawableDic.get(imgUrl); // 從快取讀取影象 else { Bitmap bmp = GetBitmap(imgUrl); // 從伺服器端下載影象 if (bmp != null) drawable = Bitmap2Drawable(bmp); // 轉化為Drawable if (drawable != null) DrawableDic.put(imgUrl, drawable); // 記錄影象 } return drawable; } /** 從網路上下載圖片資源 */ public static Bitmap GetBitmap(String imgUrl) { Bitmap bmp = null; try { byte[] data = GetBytes(imgUrl); // 下載資料 bmp = BitmapFactory.decodeByteArray(data, 0, data.length); // 載入Bitmap } catch (Exception e) { e.printStackTrace(); } return bmp; } /** Bitmap轉化為Drawable */ public static Drawable Bitmap2Drawable(Bitmap bitmap) { BitmapDrawable drawable = new BitmapDrawable(bitmap); return drawable; } /** Drawable轉化為Bitmap */ public static Bitmap Drawable2Bitmap(Drawable drawable) { BitmapDrawable bitDrawable = (BitmapDrawable) drawable; return bitDrawable.getBitmap(); } /** 獲取指定網址的資料 */ public static String GetString(String dataUrl) { String Str = ""; try { byte[] data = GetBytes(dataUrl); // 下載資料 Str = new String(data); // 轉化為字串 } catch (Exception e) { e.printStackTrace(); } return Str; } /** 獲取指定網址的資料為JSON */ public static JSONObject GetJSONObject(String jsonUrl) { String webData = WebTool.GetString(jsonUrl); JSONObject webJson = null; try { webJson = new JSONObject(webData); } catch (Exception ex) { ex.printStackTrace(); } return webJson; } // ------------------------ // 網路資料載入 // ------------------------ static HashMap<Long, byte[]> GetBytesDic = new HashMap<Long, byte[]>(); /** 獲取指定網址的資料,函式可在任意執行緒中執行,包括主執行緒 */ public static byte[] GetBytes(final String url) { final long KEY = System.currentTimeMillis(); if (!GetBytesDic.containsKey(KEY)) GetBytesDic.put(KEY, null); // 在非主執行緒中執行網路請求,獲取資料 ThreadTool.RunInCachedThread(new ThreadPram() { @Override public void Function() { byte[] data = GetBytes_process(url); GetBytesDic.put(KEY, data); } }); // 等待非同步執行緒中的網路請求邏輯執行完成 while (GetBytesDic.get(KEY) == null) // 未獲取到資料則 { if (System.currentTimeMillis() > KEY + 1000 * 3) break; // 超出3秒則終止 Sleep(50); // 延時等待非同步執行緒邏輯執行完成 } byte[] data = GetBytesDic.get(KEY); GetBytesDic.remove(KEY); return data; } /** 獲取指定網址的資料 */ public static byte[] GetBytes_process(String url) { byte[] data = new byte[0]; try { URL webUrl = new URL(url); URLConnection con = webUrl.openConnection(); // 開啟連線 InputStream in = con.getInputStream(); // 獲取InputStream data = InputStreamToByte(in); // 讀取輸入流資料 } catch (Exception e) { e.printStackTrace(); } return data; } /** InputStream -> Byte */ public static final byte[] InputStreamToByte(InputStream in) { byte[] bytes = {}; try { ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int count = 0; while ((count = in.read(data, 0, 1024)) > 0) { byteOutStream.write(data, 0, count); } bytes = byteOutStream.toByteArray(); } catch (Exception ex) { ex.printStackTrace(); } return bytes; } /** 當前執行緒延時毫秒 */ private static void Sleep(long timeMillion) { try { Thread.sleep(timeMillion); } catch (InterruptedException e) { e.printStackTrace(); } } }
ThreadTool.java 執行緒輔助操作類
package sci.tool; import java.util.concurrent.Executors; import android.os.Handler; import android.os.Looper; /** 執行緒輔助處理類,用於在主執行緒和其他執行緒中執行邏輯 */ public class ThreadTool { // 呼叫示例 public static void Example() { ThreadTool.RunInMainThread(new ThreadPram() { @Override public void Function() { // TODO Auto-generated method stub // 在主執行緒執行邏輯 } }); } // --------------------------------------------- /** 執行緒輔助處理類物件引數 */ public static abstract class ThreadPram { /** 需要線上程中執行的邏輯 */ public abstract void Function(); } /** 在主執行緒執行Function —— UI介面相關控制元件邏輯需在主執行緒中執行 */ public static void RunInMainThread(final ThreadPram param) { getMainHandler().post(new Runnable() { @Override public void run() { param.Function(); } }); } /** 在主執行緒中延時delayMillis毫秒,執行Function —— UI介面相關控制元件邏輯需在主執行緒中執行 */ public static void RunInMainThread(final ThreadPram param, long delayMillis) { getMainHandler().postDelayed(new Runnable() { @Override public void run() { param.Function(); } }, delayMillis); } /** 在其他執行緒執行Function —— 網路請求需在主執行緒之外的其他執行緒執行 */ public static void RunInCachedThread(final ThreadPram param) { Executors.newCachedThreadPool().execute(new Runnable() { @Override public void run() { param.Function(); } }); } /** 當前執行緒是否為主執行緒 */ public static boolean isUiThread() { return Thread.currentThread() == Looper.getMainLooper().getThread(); } /** 獲取主執行緒Handler */ public static Handler getMainHandler() { return new Handler(Looper.getMainLooper()); } /** 獲取當前執行緒Handler */ public static Handler getCurrentHandler() { return new Handler(Looper.myLooper()); } }