android获取网络图片简单实现

来源:互联网 发布:健康体检软件系统 编辑:程序博客网 时间:2024/05/01 23:49

android获取网络图片简单实现

在我们平时做项目的时候肯定少不了要从网络上获取图片的资源,此篇文章就讲一讲从网络上获取图片,我们要考虑的问题是

  • 1.获取怎样的url
  • 2.用什么方法获取(以前有学习web开发的同学考虑一下ajax或者从后台获取交互数据的方法在此是否适用)
  • 3.获取到的数据是否就是图片资源,是否还要解析
  • 4.直接用主线程是否适用
  • 5.怎样将最终得到的图片资源显示到activity中

  • 1 从百度搜索一张简单的图获取其链接即可(例:http://pic46.nipic.com/20140813/10153265_103918805357_2.jpg)
  • 2.类似web获取后台数据思想:
                        URL url = new URL(path);                        // 发出http请求                        HttpURLConnection huc = (HttpURLConnection) url                                .openConnection();                        // 发送请求类型                        huc.setRequestMethod("GET");                        // 设置连接超时时间(五秒)                        huc.setConnectTimeout(5000);                        // 接收返回信息类型                        int responsecode = huc.getResponseCode();//此处非常类似javascript中的ajax
  • 3.将从网络上的流转化为需要的图片资源
if (responsecode == 200) {// 当返回正确到达                            InputStream is = huc.getInputStream();// 获取文件输入流                            Bitmap bm = BitmapFactory.decodeStream(is);// 使用位图工厂将流变换为图                            }


  • 4.如果在需要在子线程中实现2.3两步
  • 5.将最终获取的图片显示到activity中

:当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
  比如说从网上获取一个图片,在一个ImageView中将其显示出来,这种涉及到网络操作的程序一般都是需要开一个线程完成网络访问,但是在获得图片后,是不能直接在网络操作线程中调用ImageView的相关方法的,因为其他线程中是不能直接访问主UI线程成员 。
  如果在子线程中改变主线程的内容操作系统会担心数个线程同时操作一个控件而导致的不安全,所以限制子线程不得直接访问主UI线程成员的
  故而:用到了Handler
  private   Handler h = new Handler() {        public void handleMessage(android.os.Message msg) {            // 对接收的数据进行处理            switch (msg.what) {            case SHOW_IMAGE:                Bitmap bitmap = (Bitmap) msg.obj;                iv_imeages.setImageBitmap(bitmap);                break;            default:                break;            }        };    };if (responsecode == 200) {// 当返回正确到达                            InputStream is = huc.getInputStream();// 获取文件输入流                            Bitmap bm = BitmapFactory.decodeStream(is);// 使用位图工厂将流变换为图片                            // 告诉主线程帮我更新页面,内容是bm                            Message msg = new Message();                            msg.what = SHOW_IMAGE;                            msg.obj = bm;                            h.sendMessage(msg);                            //iv_imeages.setImageBitmap(bm);//不能再子线程中更新view视图(因为视图不是线程安全的)                        }

完整代码块:

package cn.edu.bzu.intnetimages;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import android.R.string;import android.animation.ArgbEvaluator;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.TextUtils;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends Activity {    private Button btn_show;    private  ImageView iv_imeages;    private EditText et_url;    private  final int SHOW_IMAGE = 1;    // 在主线程中创建消息处理器    private   Handler h = new Handler() {        public void handleMessage(android.os.Message msg) {            // 对接收的数据进行处理            switch (msg.what) {            case SHOW_IMAGE:                Bitmap bitmap = (Bitmap) msg.obj;                iv_imeages.setImageBitmap(bitmap);                break;            default:                break;            }        };    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_show = (Button) findViewById(R.id.btn_show);        iv_imeages = (ImageView) findViewById(R.id.iv_images);        et_url = (EditText) findViewById(R.id.et_url);        // 当点击按钮的时候        btn_show.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                        showImage();            }        });    }       @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.main, menu);        return true;    }    /**     * http://pic46.nipic.com/20140813/10153265_103918805357_2.jpg     * 用传统的方法获取网络上的图片信息     */    public void showImage() {        final String path = et_url.getText().toString();// 获取url        if (TextUtils.isEmpty(path)) {// 当用户输入的url为空的时候            Toast.makeText(MainActivity.this, "url为空", Toast.LENGTH_SHORT)                    .show();        } else {// 当用户输入的url不为空的时候            new Thread() {                public void run() {                    // 连接服务器获取图片信息                    try {                        // 传入url                        URL url = new URL(path);                        // 发出http请求                        HttpURLConnection huc = (HttpURLConnection) url                                .openConnection();                        // 发送请求类型                        huc.setRequestMethod("GET");                        // 设置连接超时时间(五秒)                        huc.setConnectTimeout(5000);                        // 接收返回信息类型                        int responsecode = huc.getResponseCode();                        if (responsecode == 200) {// 当返回正确到达                            InputStream is = huc.getInputStream();// 获取文件输入流                            Bitmap bm = BitmapFactory.decodeStream(is);// 使用位图工厂将流变换为图片                            // 告诉主线程帮我更新页面,内容是bm                            Message msg = new Message();                            msg.what = SHOW_IMAGE;                            msg.obj = bm;                            h.sendMessage(msg);                            //iv_imeages.setImageBitmap(bm);//不能再子线程中更新view视图(因为视图不是线程安全的)                        } else {                            Toast.makeText(MainActivity.this, "显示图片失败",                                    Toast.LENGTH_SHORT).show();                        }                    } catch (MalformedURLException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    } catch (IOException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            }.start();        }    }}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <ImageView        android:id="@+id/iv_images"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/et_url"        android:layout_alignParentTop="true"        android:layout_marginLeft="32dp"        android:layout_marginTop="40dp"        android:src="@drawable/ic_launcher" />    <EditText        android:id="@+id/et_url"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        android:ems="10"        android:text="http://pic46.nipic.com/20140813/10153265_103918805357_2.jpg"       />    <Button        android:id="@+id/btn_show"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/iv_images"        android:layout_alignParentBottom="true"        android:layout_marginBottom="14dp"        android:layout_marginLeft="21dp"        android:text="Button" /></RelativeLayout>

最终千万别忘了在AndroidManifest.xml文件中添加访问网络的权限啊:

 <uses-permission android:name="android.permission.INTERNET"/>
1 0