国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > Android读取网络图片

Android读取网络图片

来源:程序员人生   发布时间:2014-11-08 08:08:04 阅读次数:3242次

  本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020  

      在android4.0以后,已不允许在主线程中进行网络要求操作了, 否则会出现NetworkOnMainThreadException异常。而为了解决在android4.0之上可以进行网络的要求,可以有两种方法来解决,以读取网络的图片为例,先看效果图:


  当点击按钮时,会将指定地址的网络图片加载在imageVIew中进行显示。

读取网络图片:

  1. 取得指定地址网络图片数据

            有两种方式将指定地址的网络读取到Bitmap中,然后通过imageView加载显示。

    1). 将输入流解码成Bitmap

private static String path = "http://221.203.108.70:8080/jxzy/UploadFiles_4517/201005/2010052615165701.jpg";

public Bitmap getData(){ Bitmap bitmap = null; try { URL url = new URL(path); URLConnection conn = url.openConnection(); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap; }
  2). 通过字节数据将输入流写入到输入流中,并通过BitmapFactory.decodeByteArray()方法将其转换成Bitmap

public Bitmap getData1(){ Bitmap bitmap = null; ByteArrayOutputStream bos = null; try { URL url = new URL(path); URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream(); bos = new ByteArrayOutputStream(); byte[] data = new byte[1024]; int len = 0; while((len = is.read(data))!= ⑴){ bos.write(data, 0, len); } byte[] data1 = bos.toByteArray(); bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, data1.length); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return bitmap; }

      

       2. 将得到的Bitmap装载在imageView中显示。

       开始也提到了,在android4.0之上不就不能在主线程中直接进行网络要求等操作了,因此为了将网络图片加载到ImageView中,也有两种方法,具体以下:

  方法1:不新建线程;

       直接在onCreate()方法中加入以下两行代码,然后直接在主线程中进行读取网络图片的操作。

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

  有了这两行代码,固然了,这些只适用android4.0之上,你如果targetSDK在4.0之下,也能够不加这两行代码,直接在主线程中进行读取网络图片的操作,但是这类方法其实不推荐。

      接下来就是将第1步两种方法得到Bitmap加载到imageView中,主要代码以下:

imageView = (ImageView)findViewById(R.id.imageView); button = (Button)findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub imageView.setImageBitmap(getData()); } });


      方法2: 利用Thread+Handler

      由于,android也不允许在非UI线程中更新UI,所以不能直接将imageView.setImageBitmap()写在线程中,这就要借助于Handler了,由于Handler是运行在主线程中的,所以在读取网络数据利用Message消息来通知Handler来通知更新UI。主要代码以下:

Handler handler = new Handler(){ public void handleMessage(Message msg) { if(msg.what == 1){ imageView.setImageBitmap(mBitmap); } }; }; Runnable runnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub Message msg = new Message(); msg.what = 1; //mBitmap = getData(); mBitmap = getData1(); handler.sendMessage(msg); } };
      接下来,就是在按钮的单击事件中新建1个线程并启动便可。
button = (Button)findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub new Thread(runnable).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" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="读取网络图片" /> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>








生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生