安卓控件使用系列17:ImageView获取网络图片

安卓使用ImageView控件获取网络图片是我们在开发应用程序中常常用到的一个功能,我们来分享一下是怎么实现这一功能的。

这个例子是点击Button按钮,就会按照制定url地址找到图片的位置,并下载绑定到对应的ImageView控件上。

整体思路:在xml文件中定义一个Button控件和一个ImageView控件,然后在活动中的Button控件的OnClick事件中开启一个线程,这个线程会调用获取网络图片的方法,在获取网络图片的方法中,使用图片工厂得到图片的路径返回一个位图对象,把这个位图对象作为一个消息的内容来传递,在handler中接收到这个消息的内容并绑定为ImageView的图片,其中获取网络数据的方式为GET方式,以读入流的形式进行。

activity_main.xml文件:

         <Button 
         android:id="@+id/button"
         android:layout_height="wrap_content"
         android:layout_width="fill_parent"
         android:text="获取网络图片"
         />
         <ImageView 
         android:id="@+id/imageview"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         />
MainActivity.java文件:

	private ImageView getImageview;
	private Button getButton;
	private final String IMAGE_URL="http://img.hen2.com/201509/source_img/150_G_1442562155435.jpg";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		 getButton = (Button) findViewById(R.id.button);
		 getImageview = (ImageView) findViewById(R.id.imageview);
		 getButton.setOnClickListener(new View.OnClickListener() {	
			@Override
			public void onClick(View v) {
				    new Thread(runa).start();
			}
		});
	}
	
//	获取网络图片
	public void setView(String path) {
		  String picturepath = path;
		  byte[] data = null;
		  try {
		   data = getImage(picturepath);
		   Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);// BitmapFactory:图片工厂!
		   Looper.prepare();// 必须调用此方法,要不然会报错
		   Message msg = new Message();
		   msg.what = 0;
		   msg.obj = bitmap;
		   handler.sendMessage(msg);
		  } catch (Exception e) {
		   Toast.makeText(getApplicationContext(), "获取图片错误", 1).show();
		  }
		 }
	
//定义一个handler给imageview绑定图片
		 private Handler handler = new Handler() {
		  @Override
		  public void handleMessage(Message msg) {
		   if (msg.what == 0) {
			   getImageview.setImageBitmap((Bitmap) msg.obj);
		   }
		  }
		 };
	 
//定义一个Runnable,调用获取网络图片的方法
		 private Runnable runa = new Runnable() {
		  @Override
		  public void run() {
		   setView(IMAGE_URL);
		  }
		 };
		 
		 // 获取网络图片的数据
		 public static byte[] getImage(String picturepath) throws Exception {
	              URL url = new URL(picturepath);
	              HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 基于http协议的连接对象
	              conn.setConnectTimeout(10000);// 10秒(源码有问题,把10(10毫秒)改为了10000(10秒)现在正确了)
	              conn.setRequestMethod("GET");// 大写
	             if (conn.getResponseCode() == 200) {
	               InputStream ins = conn.getInputStream();
	                return read(ins);
	               }
	              return null;
	         }
		 
		//流工具
		 	 public static byte[] read(InputStream ins) throws Exception {
		 	       ByteArrayOutputStream outstream = new ByteArrayOutputStream();
		 	       byte[] buffer = new byte[1024];
		 	       int length = 0;
		 	       while ((length = ins.read(buffer)) > -1) {
		 	         outstream.write(buffer, 0, length);
		 	       }
		 	       outstream.close();
		 	      return outstream.toByteArray();
		 	   }

你可能感兴趣的:(网络,安卓,获取,图片,imageview)