当前位置: 移动技术网 > 移动技术>移动开发>Android > 简单实现Android读取网络图片到本地

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

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

思路

具体的思路比较的简单,但是思想非常的单纯。那就是输入一个网址,点击按钮,将从网络上获取的一张图片显示到一个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;
  }

}

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网