简单实现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