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

 更新时间:2016年03月10日 11:04:26   作者:yhm2046   我要评论
这篇文章主要介绍了Android使用AsyncTask实现多线程下载的方法,以完整实例形式详细分析了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<String, Integer, Bitmap> {
    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("進度更新");
      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:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context=".MainActivity" >
  <TableLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerHorizontal="true" >
    <TableRow>
      <Button
        android:id="@+id/btn1"
        android:text="@string/btn1" />
      <ProgressBar
        android:id="@+id/progressbar1"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
      <ImageView
        android:id="@+id/img1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@id/img1"
        android:src="@drawable/ic_launcher" />
    </TableRow>
    <TableRow>
      <Button
        android:id="@+id/btn2"
        android:text="@string/btn2" />
      <ProgressBar
        android:id="@+id/progressbar2"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
      <ImageView
        android:id="@+id/img2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@id/img2"
        android:src="@drawable/ic_launcher" />
    </TableRow>
    <TableRow>
      <Button
        android:id="@+id/btn3"
        android:text="@string/btn3" />
      <ProgressBar
        android:id="@+id/progressbar3"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
      <ImageView
        android:id="@+id/img3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:contentDescription="@id/img3"
        android:src="@drawable/ic_launcher" />
    </TableRow>
  </TableLayout>
</RelativeLayout>

AndroidManifast:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.xunfang.asynctackdemo"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="10" />
  <!-- 访问网络的权限 -->
  <uses-permission android:name="android.permission.INTERNET" >
  </uses-permission>
  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name="com.xunfang.asynctackdemo.MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

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

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

相关文章

  • Android录制mp3格式文件

    Android录制mp3格式文件

    这篇文章主要为大家详细介绍了Android录制mp3格式文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android Studio 一个工程打包多个不同包名的APK实例详解

    Android Studio 一个工程打包多个不同包名的APK实例详解

    这篇文章主要介绍了Android Studio 一个工程打包多个不同包名的APK,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Android下SDL2实现五子棋游戏

    Android下SDL2实现五子棋游戏

    这篇文章主要介绍了Android下SDL2实现五子棋游戏的相关资料,需要的朋友可以参考下
    2016-02-02
  • Android使用Jsoup解析Html表格的方法

    Android使用Jsoup解析Html表格的方法

    这篇文章主要介绍了Android使用Jsoup解析Html表格的方法,涉及Android中Jsoup的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • Android实现Gesture手势识别用法分析

    Android实现Gesture手势识别用法分析

    这篇文章主要介绍了Android实现Gesture手势识别用法,结合实例形式较为详细的分析了Android基于Gesture实现手势识别的原理与具体实现技巧,需要的朋友可以参考下
    2016-09-09
  • Android多线程断点续传下载示例详解

    Android多线程断点续传下载示例详解

    这篇文章主要为大家详细介绍了Android多线程断点续传下载示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Android中实现GPS定位的简单例子

    Android中实现GPS定位的简单例子

    这篇文章主要介绍了Android中实现GPS定位的简单例子,例子逻辑清晰,但相对简单了些,需要的朋友可以参考下
    2014-07-07
  • 详解Android6.0运行时权限管理

    详解Android6.0运行时权限管理

    自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验。本文详细介绍了Android6.0运行时权限管理。需要的朋友一起来看下吧
    2016-12-12
  • Android内存泄漏的轻松解决方法

    Android内存泄漏的轻松解决方法

    这篇文章主要给大家介绍了关于Android内存泄漏的轻松解决方法,文中通过示例代码介绍的非常详细,对各位Android具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Android随手笔记44之JSON数据解析

    Android随手笔记44之JSON数据解析

    本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析,对android json解析 相关知识感兴趣的朋友一起学习吧
    2015-12-12

最新评论