您的位置:首页 > 编程语言

利用AsyncTast实现图片下载

2016-06-04 11:27 369 查看
创建WebImageView的ImageView的子类,这个类可以从远程资源延时加载图片

public class WebImageView  extends ImageView{

       private Drawable mplaceholder,mImage;

      public WebImageView(Context context){

     this(context,null);

  }

   public WebImageView(Context context,AttributeSet attrs){

        this(context,attrs,0);

   }

  public WebImage(Context context,AttributSet attrs,int defaultStyle){

       super(context,attrs,defaultStyle);

     }

   public void setPlaceholderImage(Drawable drawable){

           mplacehoder = drawable;

          if(mImage==null)

           setImageDrawable(mplaceholder);

      }

  public void setPlaceholderImage(int resid){

         mplacehoder = getResource().getDrawable(resid);

          if(mImage==null)

          setImageDrawable(mplacehodler);

    }

 public void setImageUrl(String url){

            DownloadTask task = new DownloadTask();

         task.execute(url);

       }

  private class DownloadTask extends AsyncTask<String,Void,Bitmap>{

        protected Bitmap doInBackground(String ...params){

             String url = params[0];

          try{

             URLConnection connection = (new URL(url)).openConnection();

             InputStream is = connection.getInputStream();

             BufferedInputStream bis = new BufferedInputStream(is);

  

            ByteArrayBuffer baf = new ByteArrayBuffer(50);

             int current =0;

             while((current = bis.read())!=-1){

                         baf.append((byte)current);

                  }

                  byte[] imageData = baf.toByteArray();

             return BitmapFactory.decodeByteArray(imageData,0,imgeData.length);

        }catch(Exception e){

          }

      }

    protect void onPostExecute(Bitmap result){

           mImage = new BitmapDrawable(result);

            if(mImage!=null)

               setImageDrawable(mImage);

      }

 }

}

AsyncTask的3个参数(输入参数,进度值,运行结果)是强类型,在这里任务输入参数是String运行结果是Bitmap没有用的中间进度值所有为Void在扩展AsyncTask是只需要实现一个doInBackground()方法,改方法定义了需要在后台线程运行的工作。

AsyncTask中定义的其他回调方法有onPreExecute(),onPostExecute()和onProgressUpdate(),它们用于在主线程中更新用户界面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息