获取网络图片
使用AsyncHttpClient获取图片数据
由于图片数据通常较大, 应该使用缓存, 当数据接收到之后保存在本地
下次再访问相同路径时添加请求头, If-Modified-Since, 传递文件的最后修改时间
服务端如果响应304, 就读取本地数据, 如果响应200, 代表服务端数据已更新, 重新从服务端读取
带缓存的文件下载:
使用AsyncHttpClient获取图片数据
由于图片数据通常较大, 应该使用缓存, 当数据接收到之后保存在本地
下次再访问相同路径时添加请求头, If-Modified-Since, 传递文件的最后修改时间
服务端如果响应304, 就读取本地数据, 如果响应200, 代表服务端数据已更新, 重新从服务端读取
注意: 也可以使用SmartImageView, 但是如果服务端同名文件更新, 有Bug
没有缓冲的图片下载:
package com.example.mynetimage;
import org.apache.http.Header;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.image.SmartImageView;
public class MainActivity extends Activity {
private EditText et;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);//获取图片的url
iv = (ImageView) findViewById(R.id.iv);//显示图片的view;
}
public void go(View v){
// iv.setImageUrl(et.getText().toString().trim());//com.loopj.android.image.SmartImageView这个类一行解决所有问题。。。
AsyncHttpClient cilent= new AsyncHttpClient();
cilent.get(et.getText().toString(), new AsyncHttpResponseHandler(){//AsyncHttpResponseHandler得到的是字节数组;
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//将获取的数据转换为图片;
Bitmap bm=BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
//将图片设置到imageview中;
iv.setImageBitmap(bm);
}
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Toast.makeText(getApplicationContext(), "哈哈,出错啦。。。", 0).show();
}
});
}
}
带缓存的文件下载:
package com.itheima.netimage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.apache.http.Header;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.image.SmartImageView;
public class MainActivity extends Activity {
private EditText et;
private SmartImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et = (EditText) findViewById(R.id.et);
iv = (SmartImageView) findViewById(R.id.iv);
ConnectivityManager manager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
System.out.println(manager.getActiveNetworkInfo().getState()); // 获取网络状态
System.out.println(manager.getActiveNetworkInfo().getTypeName()); // 获取连接类型
// 启动一个线程, 检查缓存文件夹大小, 如果超过一个指定的大小, 清理一些旧文件
}
public void go(View v) throws Exception {
String path = et.getText().toString().trim();// 获取网络地址
final File file = new File(getCacheDir(), URLEncoder.encode(path, "UTF-8")); // 定义缓存文件的路径
AsyncHttpClient client = new AsyncHttpClient();
if (file.exists()) // 如果缓存文件存在
client.addHeader("If-Modified-Since", format(file.lastModified()));// 添加请求头
client.get(path, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
if (statusCode == 200) {
Bitmap bm = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length); // 获取网络数据
iv.setImageBitmap(bm);
try {
FileOutputStream out = new FileOutputStream(file);
out.write(responseBody); // 保存到本地
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
if (statusCode == 304) {
Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath()); // 从缓存文件读取数据
iv.setImageBitmap(bm);
} else
Toast.makeText(getApplicationContext(), "网络错误: " + statusCode, Toast.LENGTH_SHORT).show();
}
});
}
public String format(long ms) {
Date date = new Date(ms);
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
String s = format.format(date);
return s;
}
// iv.setImageUrl(et.getText().toString().trim()); // SmartImageView可以直接从一个URL联网获取图片
//http://192.168.1.74/MyServer/1.jpg
}