参考此blog写的非常的好
http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html

MainActivity.java

 import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Button button = (Button)findViewById(R.id.button_downLoad);
final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
final TextView textView = (TextView) findViewById(R.id.textView_hello);
final ProgressBar progressBar2 = (ProgressBar)findViewById(R.id.progressBar2); button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar, progressBar2);//传进去需要改变的控件
asyncTask.execute(55);//传入初始参数(这里表示将从55开始计数)
}
}); }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context=".MainActivity"> <TextView
android:text="Hello World!"
android:id="@+id/textView_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> <ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar"
android:layout_gravity="center_horizontal" /> <ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/progressBar2"
android:progress="100"
android:layout_gravity="center_horizontal" /> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Download"
android:id="@+id/button_downLoad"
android:layout_gravity="center_horizontal" /> </LinearLayout>
ProgressBarAsyncTask.java
 package com.turtle920.tread;

 import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView; public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {
/*Params 启动任务执行的输入参数,比如HTTP请求的URL。由主线程中的asyncTask.execute(55);传入
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。*/
private TextView textView;
private ProgressBar progressBar;
private ProgressBar progressBar2; public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar, ProgressBar progressBar2) {
super();
this.textView = textView;
this.progressBar = progressBar;
this.progressBar2 = progressBar2;
} /**
* 这里的Integer参数对应AsyncTask中的第一个参数
* 这里的String返回值对应AsyncTask的第三个参数
* 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改
* 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作
*/
@Override
protected String doInBackground(Integer... params) {//...表示可以传若干参数
NetOperator netOperator = new NetOperator();
int i = params[0];//由主线程中的asyncTask.execute(55);传入
for (i = params[0]; i <= 100; i+=1) {
netOperator.operator();
publishProgress(i, 100-i);//传两个参数给onProgressUpdate
}
return "" + i + " " + params[0].intValue() + "****";//传参数给onPostExecute
} /**
*该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
*/
@Override
protected void onPreExecute() {
textView.setText("开始执行异步线程");
} /**
* 这里的Intege参数对应AsyncTask中的第二个参数
* 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
* onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
*/
@Override
protected void onProgressUpdate(Integer... values) {//参数来自publishProgress()
int value = values[0];
int value1 = values[1];
progressBar.setProgress(value);
progressBar2.setProgress(value1);
textView.setText(""+value+"% "+value1);
} /**
* 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)
* 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
*/
@Override
protected void onPostExecute(String result) {//参数来自doInBackground() return
textView.setText("异步操作执行结束" + result);
} }
NetOperator.java
 package com.turtle920.tread;

 //模拟网络环境
public class NetOperator { public void operator(){
try {
//休眠
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
												

android中asynctask的使用实例的更多相关文章

  1. Android中AsyncTask异步

    今天我们学习了 AsyncTack, 这是一个异步任务. 那么这个异步任务可以干什么呢? 因为只有UI线程,即主线程可以对控件进行更新操作.好处是保证UI稳定性,避免多线程对UI同时操作. 同时要把耗 ...

  2. Android中AsyncTask的使用 (包含文件的下载与存储)

    今天看到大神写的相关详解Android中AsyncTask的使用,真的很是佩服,下面我将学习到的AsynTask知识运用到项目中,其中也涉及一些文件的下载与存储到本地 啥都不说了,直接上代码,我将对其 ...

  3. Android中AsyncTask使用具体解释

    在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handl ...

  4. 详解Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更 ...

  5. 具体解释Android中AsyncTask的使用

    在Android中实现异步任务机制有两种方式,Handler和AsyncTask. Handler模式须要为每个任务创建一个新的线程,任务完毕后通过Handler实例向UI线程发送消息,完毕界面的更新 ...

  6. Android中AsyncTask的简单用法 .

    在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只 ...

  7. Android中AsyncTask的使用

    原文 https://blog.csdn.net/liuhe688/article/details/6532519 在Android中实现异步任务机制有两种方式,Handler和AsyncTask. ...

  8. 并发编程之Android中AsyncTask使用详解(四)

    更多Android高级架构进阶视频免费学习请点击:[https://space.bilibili.com/474380680] 在Android中我们可以通过Thread+Handler实现多线程通信 ...

  9. Android笔记(三十五) Android中AsyncTask

    AsyncTask<Params,Progress,Result> 是一个抽象类,通常继承这个抽象类需要指定如下几个泛型参数: 1.  Params :启动任务时出入参数的类型 2.  P ...

随机推荐

  1. java基础(4)--运算符及表达式

    运算符及表达式 算数运算 加(+) 减(-) 乘(*)  除(/) 取余(%) 自增(++) 自减(- -) 注意点 1. 同种类型参与运算(可能需要自动类型转换),返回同种类型 2. 整数的除法是整 ...

  2. 搭建maven项目步骤

    整体项目结构如下: 第一步 第二步 第三步:删除src目录,只留pom文件 第四步: 第五步: 6 7 8 9 10 11 12

  3. 线段树 - HDU1166 - 敌兵布阵

    2017-07-29 16:41:00 writer:pprp 线段树跟区间操作相关,想要在题目限定的时间内解决问题就需要用线段树这种数据结构来解决: 线段树是一种二叉平衡树 参考书目:张新华的< ...

  4. PAT1042. Shuffling Machine (20)

    #include <iostream> #include <vector> using namespace std; int n; string card[54]={" ...

  5. python 中 正则表达式 的应用

    python 中 正则表达式 的应用 最近作业中出现了正则表达式,顺便学习了一下. python比较厉害的一点就是自带对正则表达式的支持,用起来很方便 正则表达式 首先介绍一下什么是正则表达式. 正则 ...

  6. Flume-NG源码阅读之FileChannel

    FileChannel是flume一个非常重要的channel组件,非常常用.这个channel非常复杂,涉及的文件更多涉及三个包:org.apache.flume.channel.file.org. ...

  7. ps(笔记)

    窗口 工作区 默认窗口(恢复) ctrl + n 点阵图(像素图) 小方格组成的 alt 键 配合 放大缩小 ppi dpi 打印输出. 画布新建 z键 局部放大 右击实际像素操作 f键 全屏 空格键 ...

  8. C++(十七) — 宏代码、内联函数

     1.C++ 表达式返回值 返回引用:当函数返回引用类型时,没有复制返回值.相反,返回的是对象本身.(与之对应的C语言中,返回的是变量的值) C++中,表达式返回的是变量本身(也就是变量对应的地址). ...

  9. spring boot配置德鲁伊

    1.引入相关依赖,全部依赖是上一篇spring boot+mybatis依赖的基础上,再加上下边的依赖,如下: <!-- Druid数据库连接池组件 --> <dependency& ...

  10. 012-对象——魔术常量__CLASS__ __METHOD__ __FUNCTION__ __DIR__ __FILE__

    <?php /** *魔术常量__CLASS__ __METHOD__ __FUNCTION__ __DIR__ __FILE__ */ //魔术常量:__CLASS__ 得到类名. /*cla ...