三級快取和Gson解析的介面
阿新 • • 發佈:2018-12-20
Util
//單例 private static NetUtil instance; //圖片記憶體快取 private LruCache<String, Bitmap> cache; //HashMap<String, Bitmap> m;//無序的 //LinkedHashMap<String, Bitmap>m;//有序的 private File saveDir; //私有構造方法 private NetUtil(Context context) { int size = (int)(Runtime.getRuntime().freeMemory() * 0.3); cache = new LruCache<>(size); //圖片檔案快取目錄 saveDir = new File(context.getCacheDir(), "img_cache"); //不存在,建立 if(!saveDir.exists()) { saveDir.mkdirs(); } } //提供方法,獲取物件 public static NetUtil getInstance(Context context) { if(instance == null) { instance = new NetUtil(context); } return instance; } /*public interface ImageCallbak2 { void onStartLoadImage(String url, ImageView imageView); void onLoadImageSuccess(String url, Bitmap bitmap, ImageView imageView); } public void displayBitmap3(final String urlStr, final ImageView imageView) { displayBitmap(urlStr, imageView, new ImageCallbak2() { @Override public void onStartLoadImage(String url, ImageView imageView) { imageView.setTag(url); } @Override public void onLoadImageSuccess(String url, Bitmap bitmap, ImageView imageView) { if(imageView.getTag().equals(url)) { imageView.setImageBitmap(bitmap); } else { Log.i("TEST", "錯亂"); } } }); } public void displayBitmap(final String url, final ImageView imageView, final ImageCallbak2 callbak2) { callbak2.onStartLoadImage(url, imageView); new AsyncTask<String, Void, Bitmap>(){ @Override protected Bitmap doInBackground(String... strings) { return getBitmap(strings[0]); } @Override protected void onPostExecute(Bitmap bitmap) { callbak2.onLoadImageSuccess(url, bitmap, imageView); } }; }*/ //1 定義介面:合同 public interface ImageCallback { void loadImageSuccess(String url, Bitmap bitmap); } //////////////////介面回撥 public void getBitmap(final String urlStr, final ImageCallback callback) { new AsyncTask<String, Void, Bitmap>(){ @Override protected Bitmap doInBackground(String... strings) { return getBitmap(strings[0]); } @Override protected void onPostExecute(Bitmap bitmap) { callback.loadImageSuccess(urlStr, bitmap); } }.execute(urlStr); } //展示圖片,沒有錯亂 public void displayBitmap2(final String urlStr, final ImageView imageView) { //繫結url到imageview imageView.setTag(urlStr); new AsyncTask<String, Void, Bitmap>(){ @Override protected Bitmap doInBackground(String... strings) { return getBitmap(strings[0]); } @Override protected void onPostExecute(Bitmap bitmap) { if(imageView.getTag().equals(urlStr)) { imageView.setImageBitmap(bitmap); }else { Log.i("TEST", "錯亂"); } } }.execute(urlStr); } //請求一張圖片,展示給ImageView //非同步任務 public void displayBitmap(String urlStr, final ImageView imageView) { new AsyncTask<String, Void, Bitmap>(){ @Override protected Bitmap doInBackground(String... strings) { return getBitmap(strings[0]); } @Override protected void onPostExecute(Bitmap bitmap) { imageView.setImageBitmap(bitmap); } }.execute(urlStr); } //獲取圖片 public Bitmap getBitmap(String urlStr) { Bitmap result = null; //從記憶體中要 result = cache.get(url2Key(urlStr)); //記憶體命中 if(result != null) { Log.i("TEST", "記憶體中載入圖片: " + urlStr); return result; } //從磁碟中要 result = getBitmapForFile(urlStr); //檔案命中 if(result != null) { Log.i("TEST", "磁碟中載入圖片: " + urlStr); //先存到記憶體快取 cache.put(url2Key(urlStr), result); return result; } //從網路中請 Log.i("TEST", "網路中載入圖片: " + urlStr); result = getBitmapForNetwork(urlStr); //寫檔案 saveBitmap2File(urlStr, result); //存到記憶體快取 cache.put(url2Key(urlStr), result); return result; } //將url轉換成key //url 做key: 太長;如果作為檔名,不允許/ ? private String url2Key(String url) { //MD5 摘要方法 //MessageDigest return String.valueOf(url.hashCode()); } //將圖片存到檔案 private void saveBitmap2File(String urlStr, Bitmap bitmap) { //格式: png jpeg(jpg) //質量: 0 100 FileOutputStream fos = null; try { fos = new FileOutputStream(new File(saveDir,url2Key(urlStr))); //圖片質量壓縮, 並輸出到輸出流 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { if(fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } //從檔案讀取圖片 private Bitmap getBitmapForFile(String urlStr) {/////// //解碼檔案為bitmap圖片 return BitmapFactory.decodeFile(new File(saveDir, url2Key(urlStr)).getAbsolutePath()); } //執行一個網路請求,返回一個Bitmap //這一步做:請求圖片 private Bitmap getBitmapForNetwork(String urlStr) { Bitmap result = null; try { URL url = new URL(urlStr); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(5000); urlConnection.setReadTimeout(5000); int responseCode = urlConnection.getResponseCode(); if(responseCode == 200) { result = BitmapFactory.decodeStream(urlConnection.getInputStream()); } } catch (java.io.IOException e) { e.printStackTrace(); } return result; } ///////////////////普通get請求 public interface Callbak<T>{ void onSuccess(T t); } ///執行一個網路請求,通過回撥返回結果 public void getRequest(final String urlStr, final Class clazz, final Callbak callbak) { new AsyncTask<String, Void, Object>(){ @Override protected Object doInBackground(String... strings) { return getRequest(urlStr, clazz); } @Override protected void onPostExecute(Object o) { callbak.onSuccess(o); } }.execute(urlStr); } //執行一個網路請求,返回bean public <T> T getRequest(String urlStr, Class clazz) { return (T) new Gson().fromJson(getRequest(urlStr), clazz); } //執行一個網路請求,返回String結果 public String getRequest(String urlStr) { String result = ""; try { URL url = new URL(urlStr); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(5000); urlConnection.setReadTimeout(5000); int responseCode = urlConnection.getResponseCode(); if(responseCode == 200) { result = stream2String(urlConnection.getInputStream()); } } catch (java.io.IOException e) { e.printStackTrace(); } return result; } private String stream2String(InputStream is) throws IOException { StringBuilder sb = new StringBuilder(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()) { sb.append(tmp); } return sb.toString(); }`在這裡插入程式碼片`
Adapter
private Context context; private List<Bean.DataBean>mlist; public MyBaseAdafter(Context context) { this.context = context; mlist = new ArrayList<>(); } public void setListData(List<Bean.DataBean> list){ this.mlist = list; notifyDataSetChanged(); } @Override public int getCount() { return mlist.size(); } @Override public Bean.DataBean getItem(int position) { return mlist.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHoder viewHoder; if(convertView==null){ convertView = LayoutInflater.from(context).inflate(R.layout.item,parent,false); viewHoder = new ViewHoder(); viewHoder.textView1 = convertView.findViewById(R.id.textview1); viewHoder.textView2 = convertView.findViewById(R.id.textview2); viewHoder.imageView = convertView.findViewById(R.id.imageview); convertView.setTag(viewHoder); }else{ viewHoder = (ViewHoder) convertView.getTag(); } viewHoder.textView1.setText(mlist.get(position).getNews_title()); viewHoder.textView2.setText(mlist.get(position).getNews_summary()); //載入圖片 //錯亂問題 //NetUtil.getInstance().displayBitmap(getItem(position).getPic_url(), viewHoder.imageView); //NetUtil.getInstance().displayBitmap2(getItem(position).getPic_url(), viewHoder.imageView); viewHoder.imageView.setTag(getItem(position).getPic_url()); NetUtil.getInstance(context).getBitmap(getItem(position).getPic_url(), new NetUtil.ImageCallback() { @Override public void loadImageSuccess(String url, Bitmap bitmap) { if(viewHoder.imageView.getTag().equals(url)) { viewHoder.imageView.setImageBitmap(bitmap); }else { } } }); return convertView; } class ViewHoder{ private TextView textView1,textView2; private ImageView imageView; }