简单实现Android读取网络图片到本地
今天在网上看到了一个关于读取网络文件的小视频,觉得不错,拿来与大家分享
思路
具体的思路比较的简单,但是思想非常的单纯。那就是输入一个网址,点击按钮,将从网络上获取的一张图片显示到一个ImageView控件上。
这样看来,我们需要用到的核心就是网络操作了。说白了,就是读取网络流文件了。
代码展示
首先是主界面的布局文件
<LinearLayoutxmlns: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="pleasetypetheurl" /> <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>
然后是主界面的逻辑代码
packagecom.example.getphotobyxml;
importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ImageView;
importandroid.widget.Toast;
importcom.example.service.ImageService;
publicclassMainActivityextendsActivity{
privateEditTextmEt_url;
privateImageViewmIv_picture;
privateButtonmBtn_get;
/**
*初始化相关的需要使用到的ID
*/
publicvoidinit(){
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
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//记得要调用哦
init();
mBtn_get.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
Stringwebsite=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);
Bitmapbitmap=BitmapFactory.decodeByteArray(bytes,0,
bytes.length);
mIv_picture.setImageBitmap(bitmap);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
});
}
/**
*从网络以XML的方式获得一张图片,并显示到一个ImageView上
*按钮事件可以直接不注册onClickListener,而使用这个方法
*@paramview
*/
publicvoidgetPicture(Viewview){
Stringwebsite=mEt_url.getText().toString();
if(website==null||website.equals("")){
Toast.makeText(this,"请输入正确的网址哦!",Toast.LENGTH_LONG).show();
return;
}
byte[]bytes;
try{
bytes=ImageService.getImage(website);
Bitmapbitmap=BitmapFactory.decodeByteArray(bytes,0,
bytes.length);
mIv_picture.setImageBitmap(bitmap);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
service以及tools助手
packagecom.example.service;
importjava.io.InputStream;
importjava.net.HttpURLConnection;
importjava.net.URL;
importcom.example.utils.StreamTool;
/**
*图片服务的业务类
*/
publicclassImageService{
publicstaticbyte[]getImage(Stringwebsite)throwsException{
URLurl=newURL(website);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode()==200){
InputStreaminputStream=conn.getInputStream();
byte[]bytes=StreamTool.read(inputStream);
returnbytes;
}
return"读取网络数据失败".getBytes();
}
}
packagecom.example.utils;
importjava.io.ByteArrayOutputStream;
importjava.io.InputStream;
/**
*专门用于将输入流转换成一个字节数组的utils类
*/
publicclassStreamTool{
publicstaticbyte[]read(InputStreaminputStream)throwsException{
ByteArrayOutputStreambaos=newByteArrayOutputStream();
byte[]buf=newbyte[1024];
intlen=0;
while((len=inputStream.read(buf))!=-1){
baos.write(buf,0,len);
}
baos.close();
returnbuf;
}
}
总结
这里面的代码是非常的简单的,我这里贴出代码的主要的目的是为了展示分层的思想,以及重构的艺术。
在代码中我们看到了,创建了专门的类来完成专门的工作。而且不同的层次的类,处理的业务也是不一样的。这样有助于我们以面向对象的方式编程,带来更加清晰的逻辑。