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

作者:Marksinoberg 时间:2021-12-20 04:31:05 

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

思路

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

}

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

标签:android,读取,本地,网络
0
投稿

猜你喜欢

  • SpringBoot项目鉴权的4种方式小结

    2021-10-23 20:10:05
  • java中Scanner输入用法实例

    2023-09-03 18:25:36
  • Spring Data JPA 复杂/多条件组合分页查询

    2021-09-06 02:57:55
  • WPF实现雷达图(仿英雄联盟)的示例代码

    2023-07-13 18:46:53
  • Idea中maven项目实现登录验证码功能

    2023-11-29 16:50:51
  • Druid基本配置及内置监控使用_动力节点Java学院整理

    2022-12-16 20:55:58
  • java使用jaxb操作xml示例

    2023-11-05 15:02:18
  • 一篇超详细的SpringBoot整合MybatisPlus的文章

    2023-02-26 11:04:35
  • C++类与对象深入之构造函数与析构函数详解

    2021-06-29 13:44:44
  • 完美解决关于禁止ViewPager预加载的相关问题

    2021-07-05 11:50:50
  • Android编程基础之简单Button事件响应综合提示控件Toast应用示例

    2023-06-30 16:27:34
  • C语言char s[]和char* s的区别

    2022-03-27 11:24:24
  • 举例讲解Java的Hibernate框架中的多对一和一对多映射

    2023-09-05 23:05:53
  • Android使用kotlin实现多行文本上下滚动播放

    2022-05-09 08:08:29
  • 一文看懂RabbitMQ消息丢失如何防止

    2022-03-03 20:36:24
  • DevExpress根据条件设置GridControl RepositoryItem是否可编辑

    2023-03-21 14:53:30
  • Android compose气泡升起和水滴下坠动画实现示例

    2023-04-09 01:52:22
  • 如何在Android studio 中使用单例模式

    2023-03-17 21:00:38
  • Java实现图片倒影的源码实例内容

    2022-08-30 02:39:24
  • c#基于winform制作音乐播放器

    2023-08-06 11:55:08
  • asp之家 软件编程 m.aspxhome.com