[练手] 异步任务下载图片

多年前的一个小例子,只做技术练习。
1.啥是异步?
2.为什么要异步下载图片?
MainActivity:

public class MainActivity extends Activity{
    private Button btn;
    private ImageView iv;
    private ProgressBar bar;
    private String path = "http://118.244.212.82:9092/Images/20140509075810c679d.png";

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(R.layout.activity_main);
        btn = (Button)findViewById(R.id.button);
        iv = (ImageView)findViewById(R.id.imageView);
        bar = (ProgressBar)findViewById(R.id.progressBar);
        bar.setMax(100);
        bar.setProgress(0);
        btn.setOnClickListener(new OnClickListener(){
            iv.setImageResource(R.drawable.ic_launcher);
            // 创建异步任务对象
            ImageService task = new ImageService(btn, bar, iv);
            // 启动异步任务
            task.execute(path);
        })
    }
}

ImageService类:

/**
 * 定义异步下载任务--下载图片
 * 1.创建一个类即成AsyncTask,根据实际的业务确定三个泛型类型
 * Params:耗时操作需要传递的参数类型String
 * Progress:UI组件在耗时操作过程中需要的参数类型Integer,如果不需要更新UI组件,不需要声明
 * Result:耗时操作返回的结果类型
 * 2.重写doInBackground方法
 * 3.将需要更新的UI组件对象封装到异步任务中。
 */
 public class ImageService extend AsyncTask<String, Integer, Bitmap>{
    private Button btn;
    private ProgressBar bar;
    private ImageView iv;

    public ImageService(Button btn, ProgressBar bar, ImageView iv){
        super();
        this.btn = btn;
        this.bar = bar;
        this.iv = iv;
    }

    /**
     * 这个方法用于处理耗时操作,工作在子线程,异步任务启动时执行
     */
     @Override
     protected Bitmap doInBackground(String... arg0){
         Bitmap bitmap = null;
         // 可变参数提取每一个参数的跟访问数组元素一样
         // 可变参数就是可以传递那个相同数据类型的参数??
         String url = arg0[0];
         HttpURLConnection con = null;
         InputStream in = null;
         try {
             con = (HttpURLConnection) new URL(url).openConnection();
             // 5秒延迟
             con.setReadTimeout(5000);
             con.setDoInput(true);
             if(con.getResponseCode() == 200){
             in = con.getInputStream();
             bitmap = BitmapFactory.decodeStream(in);
             }
             // 模拟一个耗时操作的时间
             for(int i = 0; I <= 10; i++){
                 Thread.sleep(1000);
                 // 更新UI组件在异步任务过程中,调用此方法会调用onProgressUpdate方法。
                 publishProgress(i*10);
             }
         } catch (MalformedURLException e){
             e.printStackTrace();
         } catch (IOException e){
             e.printStackTrace();
         } catch (InterruptedException e){
             e.printStackTrace();
         }
     }
     return bitmap;
 }

 /**
  * 工作在UI线程,在执行完doInBackground后执行此方法,同时将返回结果传递给此方法
  * 可以在这个方法中处理跟Handler一样的业务--更新UI组件
  */
  @Override
  protected void onPostExecute(Bitmap result){
      btn.setText("下载完毕");
      // 设置图片
      iv.setImageBitmap(result);
  }

 /**
  * 工作在UI主线程的,在执行doInBackgroud方法之前执行,用于做耗时操作之前提示在UI界面提示用户
  * 更新UI组件
  */
 @Override
 protected void onPreExecute() {
     btn.setText("正在下载...");
 }

 /**
  * 工作的UI主线程,在doInBackgroud方法执行过程中通过
  * publishProgress(progress)与此方法通信
  */
 @Override
 protected void onProgressUpdate(Integer... values) {
     bar.setProgress(values[0]);//更新进度条的进度值
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值