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