編輯:關於Android編程
上一篇已經把王略中的圖片獲取到了。生活中有這麼些場景:微信聯網打開別人照片後,當手機斷網的時候再去點擊人家的額圖片還能完整看到。這時候,已經不是去網路中獲取圖片了,其實微信在獲取網絡圖片同時把圖片在本地做咯額個緩存,這也是微信生成垃圾文件最多的原因之一。
本篇雖然以最簡單直接的方式去對圖片做緩存,但是,其實本質都差不多的。因為上一篇已經介紹的很詳細了(讀者可以去閱讀),這一篇增加一點點功能就好了。代碼如下:
package com.itydl.imageviewer; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import com.ithiema.cacheimageviewer.R; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.view.Menu; import android.view.View; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { static ImageView iv; static MainActivity ma; static Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: iv.setImageBitmap((Bitmap)msg.obj); break; case 0: Toast.makeText(ma, "請求失敗", 0).show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); ma = this; } public void click(View v){ final String path = "http://192.168.13.13:8080/dd.jpg"; final File file = new File(getCacheDir(), getFileName(path)); //判斷,緩存中是否存在該文件 if(file.exists()){ //如果緩存存在,從緩存讀取圖片 System.out.println("從緩存讀取的"); Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath()); iv.setImageBitmap(bm); } else{ //如果緩存不存在,從網絡下載 System.out.println("從網上下載的"); Thread t = new Thread(){ @Override public void run() { try { URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.connect(); if(conn.getResponseCode() == 200){ //獲取服務器響應頭中的流,流裡的數據就是客戶端請求的數據 InputStream is = conn.getInputStream(); //讀取服務器返回的流裡的數據,把數據寫到本地文件,緩存起來 FileOutputStream fos = new FileOutputStream(file); byte[] b = new byte[10240]; int len = 0; while((len = is.read(b)) != -1){ fos.write(b, 0, len); } fos.close(); //讀取出流裡的數據,並構造成位圖對象 //流裡已經沒有數據了 // Bitmap bm = BitmapFactory.decodeStream(is); Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath()); Message msg = new Message(); msg.obj = bm; msg.what = 1; //把消息發送至主線程的消息隊列 handler.sendMessage(msg); } else{ // Toast.makeText(MainActivity.this, "請求失敗", 0).show(); Message msg = handler.obtainMessage(); msg.what = 0; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; t.start(); } } public String getFileName(String path){ int index = path.lastIndexOf("/"); return path.substring(index + 1); } }可以看到,首先是去本地緩存文件中獲取圖片信息的,如果獲取不到,就去訪問網絡圖片。只要一次訪問網絡成功,就會在本地獲取到。除非做了清理。那麼斷網之後,再來運行一下效果看看吧:
上一篇博客,我們介紹了項目分包的結構,這一篇我們重點來介紹一下MVP架構在項目中的應用,MVP可以說是MVC模式的一種升級,在MVP出現之前,一般都是用MVC,但是使用M
我們知道,頁面導航器(Navigator)在幾乎所有的項目中都會用到,平時大多數時候為了節省時間,都會直接在github上面拿別人的開源項目來用,最近自己在復習自定義Vi
一,IntelliJ 代碼檢查IntelliJ IDEA的具有強大,快速,靈活的靜態代碼分析。它可以檢測編譯器和運行時錯誤,提出改進和完善,甚至在編譯之前。代碼檢查基礎(
時間選擇器(TimePicker)java.lang.Object;android.view.View;android.view.ViewGroup;android.wi