怎么调用loadimagefromnetwork

如题所述

第1个回答  2017-04-03
android中获取中国络图片,一般采用http的方式,是一件耗时的操作,如果直接获取有可能会出现应用程序无响应(ANR:Application Not Responding)对话框的情况。对于这种情况,一般的方法就是耗时操作用线程来实现。下面列三种获取url图片的方法: 一.直接获取: 缺陷:此方式是直接在主线中做了耗时操作,严重影响app性能,很可能造成ANR 优点:代码简单,通俗易懂 核心的android代码 : mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ; Drawable drawable = loadImageFromNetwork(IMAGE_URL); mImageView.setImageDrawable(drawable) ; // private Drawable loadImageFromNetwork(String imageUrl) { Drawable drawable = null; try { // 可以在这里通过文件名来判断,是否本地有此图片 drawable = Drawable.createFromStream( new URL(imageUrl).openStream(), "image.jpg"); } catch (IOException e) { Log.d("test", e.getMessage()); } if (drawable == null) { Log.d("test", "null drawable"); } else { Log.d("test", "not null drawable"); } return drawable ; } 二. 后台线程获取url图片: 优点:将耗时操作放在异步线程,提高app性能 缺陷:由于操作界面需要在主线程中进行,造成主线程与异步线程频繁切换。代码复杂难懂 核心android代码 mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ; final Handler handler = xxxxxxx; new Thread(new Runnable(){ Drawable drawable = null; @Override public void run() { // post() 特别关键,就是到UI主线程去更新图片 mImageView.post(new Runnable(){ @Override public void run() { drawable = loadImageFromNetwork(IMAGE_URL); //采用Handler将drawable post到主线程,然后在主线程中调用代码 //mImageView.setImageDrawable(drawable) ; }}) ; } }).start() ; 三.AsyncTask获取url图片 优点:此方式时android官方推荐,性能方面集合了第二种方式。建议采用 缺陷:用此方式时,需要对AsyncTask的原理有一定了解 Java代码 mImageView = (ImageView)this.findViewById(R.id.imageThreadConcept) ; new DownloadImageTask().execute(IMAGE_URL) ; private class DownloadImageTask extends AsyncTask { protected Drawable doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } protected void onPostExecute(Drawable result) { mImageView.setImageDrawable(result); }