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……,这是为了方便,一下子抓取所有异常。当然,写的东西如果上点档次的话,建议不要这样……

posted @ 2015-02-01 21:52  冠king  阅读(362)  评论(0编辑  收藏  举报