Android 通过url获取网络图片并显示在ImageView中

由于谷歌在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();       
      }
}

你可能感兴趣的:(Android)