編輯:關於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架構在項目中的應用,MVP可以說是MVC模式的一種升級,在MVP出現之前,一般都是用MVC,但是使用M
Android實現仿網易新聞的頂部導航指示器
我們知道,頁面導航器(Navigator)在幾乎所有的項目中都會用到,平時大多數時候為了節省時間,都會直接在github上面拿別人的開源項目來用,最近自己在復習自定義Vi
AndroidStudio代碼檢查,Lint檢查,還有注解
一,IntelliJ 代碼檢查IntelliJ IDEA的具有強大,快速,靈活的靜態代碼分析。它可以檢測編譯器和運行時錯誤,提出改進和完善,甚至在編譯之前。代碼檢查基礎(
閱讀《Android 從入門到精通》(14)——時間選擇器
時間選擇器(TimePicker)java.lang.Object;android.view.View;android.view.ViewGroup;android.wi