本文实例讲述了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:

<?xml version="1.0" encoding="utf-8"?>                                                

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

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

更多相关文章

  1. Android 在非UI线程中读网络数据
  2. android实现节点进度条效果
  3. android studio 主线程中访问网络,遇到android.os.NetworkOnMainT
  4. Android Sqlite 数据库多线程操作
  5. [Android] 图片JNI(C++\Java)高斯模糊 多线程
  6. android进度条的使用

随机推荐

  1. android保存用户名密码
  2. android 全屏去掉底部虚拟导航栏
  3. android studio 56 下载网络歌曲 代码
  4. Android(安卓)Fragment
  5. android 创建实时文件夹
  6. android 模拟器上GPS的使用
  7. android 实现拍照有2种方式
  8. Android(安卓)崩溃日志的获取方式
  9. Android(安卓)2d物理引擎Box2d介绍
  10. Android(安卓)Studio Run程序时自动执行