Android 下载网络图片并显示到本地
Android下载网络图片的流程是:
发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件。
注意点
- 最新的Android系统不可以在主线程上请求网络,需要使用线程来请求
- 下载图片属于耗时任务,最优做法是放在一个AsyncTask中操作
设计思路
1.网络请求:该例中需要下载的文件类型是图片类型,可以将网络请求获取的数据类型转换为Bitmap已供ImageView直接使用,但是一个合理的网络请求类的设计是将下载的数据类型转换为最基本的InputStream,这样不管是下载图片,音频,文本还是视频,都可以将结果抛出去让上层的逻辑来处理。
2.异步请求:下载图片,网络下载属于耗时操作,所以需要封装一个AsyncTask来处理网络请求,该请求继承自Runnable接口。
3.异步回调:前台需要通过回调的方式来得到图片源,并将该图片源赋值给ImageView.
相关代码
NetService:网络请求服务类
publicclassNetService{ publicstaticInputStreamgetInputStreamByUrl(Stringaddress){ URLurl=null; HttpURLConnectionurlConnection=null; try{ url=newURL(address); urlConnection=(HttpURLConnection)url.openConnection(); urlConnection.setConnectTimeout(2*1000); urlConnection.setRequestMethod("GET"); returnurlConnection.getInputStream(); }catch(IOExceptione){ e.printStackTrace(); } returnnull; } }
NetServiceTask:AsyncTask类
importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.os.AsyncTask; importjava.io.BufferedInputStream; importjava.io.InputStream; publicclassNetServiceTaskextendsAsyncTask publicNetServiceTask(Stringaddress,URLPostHandlerurlPostHandler){ this.address=address; this.urlPostHandler=urlPostHandler; } /** *表示任务执行之前的操作 */ @Override protectedvoidonPreExecute(){ //TODOAuto-generatedmethodstub super.onPreExecute(); } /** *主要是完成耗时的操作 */ @Override protectedBitmapdoInBackground(String...arg0){ InputStreaminputStream=NetService.getInputStreamByUrl(arg0[0]); if(inputStream!=null){ returnBitmapFactory.decodeStream(newBufferedInputStream(inputStream)); } returnnull; } /** *主要是更新UI的操作 */ @Override protectedvoidonPostExecute(Bitmapresult){ //TODOAuto-generatedmethodstub super.onPostExecute(result); if(this.urlPostHandler!=null&&result!=null){ this.urlPostHandler.PostHandler(result); } } @Override publicvoidrun(){ execute(this.address); } }
URLPostHandler:回调接口
publicinterfaceURLPostHandler{ voidPostHandler(Bitmapbitmap); }
前台请求图片并显示到ImageView
publicclassMainActivityextendsAppCompatActivity{ ButtonbuttonDownload; ImageViewimageViewImg; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonDownload=(Button)findViewById(R.id.buttonDownload); imageViewImg=(ImageView)findViewById(R.id.imageViewImg); buttonDownload.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ Stringaddress="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490783056273&di=6160d101d31dcf5f44b443ad9c5b2648&imgtype=0&src=http%3A%2F%2Fimg.sc115.com%2Fuploads%2Fallimg%2F110626%2F2011062622383898.jpg"; NetServiceTasknetServerTask=newNetServiceTask(address,newURLPostHandler(){ @Override publicvoidPostHandler(Bitmapbitmap){ imageViewImg.setImageBitmap(bitmap); } }); Threadthread=newThread(netServerTask); thread.start(); } }); } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!