Android使用AsyncTask实现多线程下载的方法

本文实例讲述了Android使用AsyncTask实现多线程下载的方法。分享给大家供大家参考,具体如下:

public class MainActivity extends Activity implements OnClickListener {
  private Button btn1, btn2, btn3;
  private ProgressBar progressBar1, progressBar2, progressBar3;
  private ImageView img1, img2, img3;
  private static final String IMG_URI = "//www.jb51.net/images/logo.gif";
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    initListener();
  }
  /**
   * 初始化监听器
   */
  private void initListener() {
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
  }
  /**
   *
   * 初始化控件
   */
  private void initView() {
    btn1 = (Button) findViewById(R.id.btn1);
    btn2 = (Button) findViewById(R.id.btn2);
    btn3 = (Button) findViewById(R.id.btn3);
    progressBar1 = (ProgressBar) findViewById(R.id.progressbar1);
    progressBar2 = (ProgressBar) findViewById(R.id.progressbar2);
    progressBar3 = (ProgressBar) findViewById(R.id.progressbar3);
    img1 = (ImageView) findViewById(R.id.img1);
    img2 = (ImageView) findViewById(R.id.img2);
    img3 = (ImageView) findViewById(R.id.img3);
  }
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }
  @Override
  public void onClick(View arg0) {
    // 点击按钮模拟下载
    MyDownloadAsy down = new MyDownloadAsy();
    down.execute(IMG_URI, arg0.getId() + "");
  }
  /**
   * 1.Params,传递给后台任务的参数类型。
   *
   * 2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
   *
   * 3.Result, 后台执行返回的结果的类型。
   */
  class MyDownloadAsy extends AsyncTask {
    private static final String TAG = "asy";
    private int clickBtn = 0;
    private void i(String object) {
      Log.i(TAG, object);
    }
    @Override
    protected void onPreExecute() {
      // TODO Auto-generated method stub
      super.onPreExecute();
      i("��溥\行�程");
      progressBar1.setProgress(0);// 进度条复位
      progressBar2.setProgress(0);// 进度条复位
      progressBar3.setProgress(0);// 进度条复位
    }
    @Override
    protected Bitmap doInBackground(String... arg0) {
      switch (Integer.parseInt(arg0[1])) {
      case R.id.btn1:
        clickBtn = 1;
        break;
      case R.id.btn2:
        clickBtn = 2;
        break;
      case R.id.btn3:
        clickBtn = 3;
        break;
      default:
        break;
      }
      i("正在后台执行");
      publishProgress(0);
      // 下载图片
      HttpClient hc = new DefaultHttpClient();
      // 等待2s
      sleepWait();
      publishProgress(50);
      HttpGet hg = new HttpGet(arg0[0]);// 获取jb51的logo
      final Bitmap bm;
      try {
        HttpResponse hr = hc.execute(hg);
        bm = BitmapFactory.decodeStream(hr.getEntity().getContent());
      } catch (Exception e) {
        return null;
      }
      sleepWait();
      publishProgress(100);
      // mImageView.setImageBitmap(result); 不能在后台线程操作ui
      return bm;
    }
    /**
     * 等待2s钟
     */
    private void sleepWait() {
      try {
        Thread.sleep(2000);
      } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
      }
    }
    protected void onProgressUpdate(Integer... values) {
      // 动态更新
      i("�M度更新");
      switch (clickBtn) {
      case 1:
        progressBar1.setProgress(values[0]);// 更新进度条的进度
        break;
      case 2:
        progressBar2.setProgress(values[0]);// 更新进度条的进度
        break;
      case 3:
        progressBar3.setProgress(values[0]);// 更新进度条的进度
        break;
      default:
        break;
      }
    }
    protected void onPostExecute(Bitmap result) {
      // TODO Auto-generated method stub
      super.onPostExecute(result);
      i("线程执行完成");
      if (result != null) {
        i("下载图片成功");
        switch (clickBtn) {
        case 1:
          img1.setImageBitmap(result);
          break;
        case 2:
          img2.setImageBitmap(result);
          break;
        case 3:
          img3.setImageBitmap(result);
          break;
        default:
          break;
        }
      } else {
        i("下载图片失败");
      }
    }
    @Override
    protected void onCancelled() {
      // TODO Auto-generated method stub
      super.onCancelled();
      i("取消线程");
      switch (clickBtn) {
      case 1:
        progressBar1.setProgress(0);// 进度条复位
        break;
      case 2:
        progressBar2.setProgress(0);// 进度条复位
        break;
      case 3:
        progressBar3.setProgress(0);// 进度条复位
        break;
      default:
        break;
      }
    }
  }
}

xml:


  
    
      

AndroidManifast:



  
  
  
  
  
    
      
        
        
      
    
  


更多关于Android相关内容感兴趣的读者可查看本站专题:《Android调试技巧与常见问题解决方法汇总》、《Android开发入门与进阶教程》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

你可能感兴趣的:(Android使用AsyncTask实现多线程下载的方法)