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 = "http://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程序设计有所帮助。

(0)

相关推荐

  • Android开发笔记之:深入理解多线程AsyncTask

    Understanding AsyncTaskAsyncTask是Android 1.5 Cubake加入的用于实现异步操作的一个类,在此之前只能用Java SE库中的Thread来实现多线程异步,AsyncTask是Android平台自己的异步工具,融入了Android平台的特性,让异步操作更加的安全,方便和实用.实质上它也是对Java SE库中Thread的一个封装,加上了平台相关的特性,所以对于所有的多线程异步都强烈推荐使用AsyncTask,因为它考虑,也融入了Android平台的特性,

  • Android多线程AsyncTask详解

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件开辟一个新的线程来执行.默认的情况下,在一个相同Android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为Main线程.当我们通过某个组件来启动另一个组件的时候,这个时候默认都是在同一个线程当中完成的.当然

  • android使用AsyncTask实现多线程下载实例

    AsyncTask不仅方便我们在子线程中对UI进行更新操作,还可以借助其本身的线程池来实现多线程任务.下面是一个使用AsyncTask来实现的多线程下载例子. 01 效果图 02 核心类 - DownloadTask.class public class DownloadTask extends AsyncTask<String, Integer, Integer> { public static final int TYPE_SUCCESS = 0; public static final

  • 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,

  • Android 使用AsyncTask实现多线程断点续传

    前面一篇博客<AsyncTask实现断点续传>讲解了如何实现单线程下的断点续传,也就是一个文件只有一个线程进行下载.    对于大文件而言,使用多线程下载就会比单线程下载要快一些.多线程下载相比单线程下载要稍微复杂一点,本博文将详细讲解如何使用AsyncTask来实现多线程的断点续传下载. 一.实现原理 多线程下载首先要通过每个文件总的下载线程数(我这里设定5个)来确定每个线程所负责下载的起止位置. long blockLength = mFileLength / DEFAULT_POOL_S

  • python基于queue和threading实现多线程下载实例

    本文实例讲述了python基于queue和threading实现多线程下载的方法,分享给大家供大家参考.具体方法如下: 主代码如下: #download worker queue_download = Queue.Queue(0) DOWNLOAD_WORKERS = 20 for i in range(DOWNLOAD_WORKERS): DownloadWorker(queue_download).start() #start a download worker for md5 in MD5

  • Android实现多线程下载文件的方法

    本文实例讲述了Android实现多线程下载文件的方法.分享给大家供大家参考.具体如下: 多线程下载大概思路就是通过Range 属性实现文件分段,然后用RandomAccessFile 来读写文件,最终合并为一个文件 首先看下效果图: 创建工程 ThreadDemo 首先布局文件 threaddemo.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo

  • Android实现多线程断点下载的方法

    本文实例讲述了Android实现多线程断点下载的方法.分享给大家供大家参考.具体实现方法如下: package cn.itcast.download; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputSt

  • Android实现多线程下载图片的方法

    很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天整理出两种比较好的方法来实现远程图片的下载. 方法一.直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection 或URLConnection也可以. static Bitmap downloadBitmapB

  • Android 使用AsyncTask实现多任务多线程断点续传下载

    这篇博客是AsyncTask下载系列的最后一篇文章,前面写了关于断点续传的和多线程下载的博客,这篇是在前两篇的基础上面实现的,有兴趣的可以去看下. 一.AsyncTask实现断点续传 二.AsyncTask实现多线程断点续传 这里模拟应用市场app下载实现了一个Demo,因为只有一个界面,所以没有将下载放到Service中,而是直接在Activity中创建.在正式的项目中,下载都是放到Service中,然后通过BroadCast通知界面更新进度. 上代码之前,先看下demo的运行效果图吧. 下面

  • Android带进度条的下载图片示例(AsyncTask异步任务)

    为什么要用异步任务? 在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作.如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常.所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask. AsyncTask可以在子线程中更新ui,封装简化了异步操作.适用于简单的异步处理.如果多个后台任务时就要使用Handler了

  • Android编程开发实现多线程断点续传下载器实例

    本文实例讲述了Android编程开发实现多线程断点续传下载器.分享给大家供大家参考,具体如下: 使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点续传功能,下次启动时从记录位置继续下载,可避免重复部分的下载.这里采用数据库来记录下载的进度. 效果图:   断点续传 1.断点续传需要在下载过程中记录每条线程的下载进度 2.每次下载开始之前先读取数据库

随机推荐