首页 > 系统 > Android > 正文

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

2020-01-02 07:00:46
字体:
来源:转载
供稿:网友

本文实例讲述了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.VeVB.COm/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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表