由于谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是:
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里,可以新开一个子线程,而子线程里是不能对主线程的UI进行改变的,因此就可以使用Handler,主线程里定义Handler,子线程里进行UI更新。
MainActivity.java:
public class MainActivity extends Activity {
private ImageView getImg;
private byte[] data;
private Bitmap bitmap;
static String urlpath = "http://img04.sogoucdn.com/app/a/100520024/388117fce2d37aa9a19656c7643e2a9c";
private Handler handler = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建属于主线程的handler
handler = new Handler();
getImg = (ImageView) this.findViewById(R.id.img_get);
new Thread() {
public void run() {
try {
// 通过url获得图片数据
data = GetUserHead(urlpath);
} catch (IOException e) {
e.printStackTrace();
}
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
// 子线程runnable将会执行
handler.post(runnable);
}
}.start();
}
/*
* 在新开的线程中设置图片显示
*/
Runnable runnable = new Runnable() {
public void run() {
getImg.setImageBitmap(bitmap);
}
};
/**
* @param urlpath String类型
* @return byte[]类型
* @throws IOException
*/
public static byte[] GetUserHead(String urlpath) throws IOException {
URL url = new URL(urlpath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET"); // 设置请求方法为GET
conn.setReadTimeout(5 * 1000); // 设置请求过时时间为5秒
InputStream inputStream = conn.getInputStream(); // 通过输入流获得图片数据
byte[] data = StreamTool.readInputStream(inputStream); // 获得图片的二进制数据
return data;
}
}
/*
* 从数据流中获得数据
*/
class StreamTool {
public static byte[] readInputStream(InputStream inputStream)throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
}