URL下载图片
url下载图片注意点:
1、与网路连接,下载东西这些事情最好放在子线程中进行,防止阻塞主线程;
2、子线程不能直接对界面进行操作,可以通过Handler类来传递消息,具体流程如下:
(1)在类中定义一个Handler,并重载里面处理信息的函数,如
Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { super.handleMessage(msg); if (msg.what == 100){ image.setImageBitmap(bitmap); Toast.makeText(MainActivity.this, "Image dowload completeed!", Toast.LENGTH_SHORT).show(); } else if (msg.what == 200) Toast.makeText(MainActivity.this, "Show on screen!", Toast.LENGTH_SHORT).show(); else { Bundle bundle = msg.getData(); String message = bundle.getString("msg"); Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT) .show(); } } };
(2)在子线程中需要对界面进行的操作,先放到一个Bundle中,再见Bundle放到一个Message中,再用上面定义的handler将他send出来,具体代码下面会有;
这里实现一个实现下载图片的功能,核心代码如下:
public void dowload(final String address) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { url = new URL(address); InputStream is = url.openStream(); bitmap = BitmapFactory.decodeStream(is); handler.sendEmptyMessage(100); is.close(); is = url.openStream(); if (Environment.getExternalStorageDirectory().equals( Environment.MEDIA_MOUNTED)) { Bundle bundle = new Bundle(); bundle.putString("msg", "SD card doesn't exits"); Message message = new Message(); message.setData(bundle); handler.sendMessage(message); return; } File file = new File( Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); if (file.exists()) file.delete(); file.createNewFile(); FileOutputStream out = new FileOutputStream(file); byte[] buf = new byte[1024 * 4]; int count = 0; while ((count = is.read(buf)) > 0) out.write(buf, 0, count); out.close(); if (file.exists()) handler.sendEmptyMessage(200); } catch (Exception e) { Bundle bundle = new Bundle(); bundle.putString("msg", e.getMessage()); Message message = new Message(); message.setData(bundle); handler.sendMessage(message); } } }).start(); }
这个函数实现下载功能,注意里面对手机内存进行了访问,所以记得在配置文件中声明所需要的权限,还有,因为涉及到连网,还要活得访问INTERNET的权限。每次需要下载图片时只要调用这个函数就可以了。我这里有点偷懒,就用了一个try……catch……,这是为了方便,一下子抓取所有异常。当然,写的东西如果上点档次的话,建议不要这样……