开启子线程的方法(三)

害羞这次是AsyncTask异步任务,他这个方法不用写子线程,会自动开启一个子线程的任务,比那两个更简洁,相当于其他那俩结合,这次举个例子好了,先看一下最终效果图

就是这个样子的,上面那个是文本TextView,下面那俩是button按钮,最后是一个进度条progressBar。


1.首先 打开eclipse,也是在.xml文件中先拖入这几个控件,对两个按钮设置onclick属性,="asyncTask",还是给你们看下代码比较好

<LinearLayout 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:orientation="vertical">

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="40dp"
        android:text="正在下载0个文件" />
    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="asynctask"
        android:text="启动任务" />
    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="asynctask"
        android:text="取消任务" />


    <ProgressBar
        android:id="@+id/pb"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</LinearLayout>

2.然后呢打开MainActivity.java文件,敲代码。

先写一个刚刚监听的对象asynctask,然后写入跳转方法

3.自定义一个类继承自AsyncTask,然后重写里面的四个方法

4.初始化刚刚自定类的对象,还有准备数组。

好了,接下来看看代码怎么写的吧!



package com.example.cc;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

 // 准备数组待会传递异步任务
 private String[] s = new String[] { "一号", "二号", "三号", "四号" };

 TextView tv = null;// 更新窗体
 ProgressBar pb = null;// 进度
 Myat myat = new Myat();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  tv = (TextView) findViewById(R.id.tv);
  pb = (ProgressBar) findViewById(R.id.pb);
 }

 public void asynctask(View v) {
  switch (v.getId()) {
  case R.id.btn1:
   myat.execute(s);
   break;
  case R.id.btn2:
   myat.cancel(true);
   break;
  }
 }

 // 第一参数,执行时传递进去的类型
 // 第二参数,更新那是用的参数
 // 第三参数,结束时传递进去的方法类型
 // 自定义一个类继承asynctask
 class Myat extends AsyncTask<String, Integer, Integer> {

  // 在子线程前开始运行
  @Override
  protected void onPreExecute() {

   // 初始化页面
   Log.d("zxx", "onpreExecute is over !");
   super.onPreExecute();
  }

  @Override
  protected Integer doInBackground(String... params) {
   int i = 0;
   for (i = 0; i < params.length; i++) {

    try {
     Thread.sleep(2000);
    } catch (InterruptedException e) {
     e.printStackTrace();
    }
    publishProgress(i, params.length);
   }
   return params.length;
  }

  @Override
  protected void onProgressUpdate(Integer... values) {

   tv.setText(values[0] + "");
   pb.setProgress((int) ((float) (values[0] + 1) / (float) values[1] * 100));
   super.onProgressUpdate(values);
  }

  // 这个方法执行在异步任务结束之后
  @Override
  protected void onPostExecute(Integer result) {
   super.onPostExecute(result);
   Toast.makeText(getApplicationContext(), "你下载了" + result + "个文件",
     Toast.LENGTH_SHORT).show();
  }

 }
}


如果想要再细一点,就是取消任务,弹出个toast提醒一下你,我取消任务了,可以在for循环里加两行代码:

 
     if (isCancelled()) {

      Toast.makeText(getApplicationContext(), "子线程停止了!!!!", Toast.LENGTH_SHORT).show();
      
    }

这样他就会提醒你,子线程停止了。

这次提前写的三,二的话改天我再敲敲在给你们说,

是不是感觉很好玩,快去自己动手试试吧!!!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值