欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

简单实现Android读取网络图片到本地

程序员文章站 2024-03-05 19:37:07
今天在网上看到了一个关于读取网络文件的小视频,觉得不错,拿来与大家分享 思路 具体的思路比较的简单,但是思想非常的单纯。那就是输入一个网址,点击按钮,将从网络上获取的一...

今天在网上看到了一个关于读取网络文件的小视频,觉得不错,拿来与大家分享

思路

具体的思路比较的简单,但是思想非常的单纯。那就是输入一个网址,点击按钮,将从网络上获取的一张图片显示到一个imageview控件上。
这样看来,我们需要用到的核心就是网络操作了。说白了,就是读取网络流文件了。

代码展示

首先是主界面的布局文件

<linearlayout 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:orientation="vertical" >

  <edittext 
    android:id="@+id/et_website"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="please type the url "
    />
  <button 
    android:id="@+id/btn_get"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="check"

    />
  <imageview 
    android:id="@+id/iv_picture"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher"
    />

</linearlayout>

 然后是主界面的逻辑代码

package com.example.getphotobyxml;

import android.app.activity;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.edittext;
import android.widget.imageview;
import android.widget.toast;

import com.example.service.imageservice;

public class mainactivity extends activity {

  private edittext met_url;
  private imageview miv_picture;
  private button mbtn_get;

  /**
   * 初始化相关的需要使用到的id
   */
  public void init() {
    met_url = (edittext) findviewbyid(r.id.et_website);
    miv_picture = (imageview) findviewbyid(r.id.iv_picture);
    mbtn_get = (button) findviewbyid(r.id.btn_get);

  }

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);

    //记得要调用哦
    init();

    mbtn_get.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        string website = met_url.gettext().tostring();
        if (website == null || website.equals("")) {
          toast.maketext(mainactivity.this, "请输入正确的网址哦!",
              toast.length_long).show();
          return;
        }
        byte[] bytes;

        try {
          bytes = imageservice.getimage(website);
          bitmap bitmap = bitmapfactory.decodebytearray(bytes, 0,
              bytes.length);
          miv_picture.setimagebitmap(bitmap);
        } catch (exception e) {
          // todo auto-generated catch block
          e.printstacktrace();
        }
      }
    });
  }

  /**
   * 从网络以xml的方式获得一张图片,并显示到一个imageview上
   * 按钮事件可以直接不注册onclicklistener,而使用这个方法
   * @param view
   */
  public void getpicture(view view) {
    string website = met_url.gettext().tostring();
    if (website == null || website.equals("")) {
      toast.maketext(this, "请输入正确的网址哦!", toast.length_long).show();
      return;
    }
    byte[] bytes;

    try {
      bytes = imageservice.getimage(website);
      bitmap bitmap = bitmapfactory.decodebytearray(bytes, 0,
          bytes.length);
      miv_picture.setimagebitmap(bitmap);
    } catch (exception e) {
      // todo auto-generated catch block
      e.printstacktrace();
    }

  }

}

service 以及 tools助手

package com.example.service;

import java.io.inputstream;
import java.net.httpurlconnection;
import java.net.url;

import com.example.utils.streamtool;

/**
*图片服务的业务类
*/
public class imageservice {

  public static byte[] getimage(string website) throws exception {

    url url = new url(website);
    httpurlconnection conn = (httpurlconnection) url.openconnection();
    conn.setconnecttimeout(5000);
    conn.setrequestmethod("get");
    if(conn.getresponsecode()==200){
      inputstream inputstream = conn.getinputstream();
      byte[] bytes = streamtool.read(inputstream);
      return bytes;
    }
    return "读取网络数据失败".getbytes();
  }



}

package com.example.utils;

import java.io.bytearrayoutputstream;
import java.io.inputstream;

/**
*专门用于将输入流转换成一个字节数组的utils类
*/
public class streamtool {

  public static byte[] read(inputstream inputstream) throws exception {
    bytearrayoutputstream baos = new bytearrayoutputstream();
    byte[] buf = new byte[1024];
    int len = 0;
    while((len = inputstream.read(buf))!=-1){
      baos.write(buf, 0 ,len);
    }
    baos.close();
    return buf;
  }

}

总结
这里面的代码是非常的简单的,我这里贴出代码的主要的目的是为了展示分层的思想,以及重构的艺术。
在代码中我们看到了,创建了专门的类来完成专门的工作。而且不同的层次的类,处理的业务也是不一样的。这样有助于我们以面向对象的方式编程,带来更加清晰的逻辑。