android中asynctask的使用实例
2024-10-18 08:47:29
参考此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();
}
} }
最新文章
- django models auto_now和auto_now_add的区别
- ado.net 属性扩展 综合练习
- js spin 加载动画(loading)
- Linux C 程序 数组(EIGHT)
- [转] 用实例给新手讲解RSA加密算法
- 转接口IC GM7150BN/ GM7150BC:CVBS转BT656芯片 低功耗NTSC/PAL 视频解码器
- Visual Studio 2013创建自定义多项目模版
- MQTT之Mosquitto
- 大数据入门基础系列之Hadoop1.X、Hadoop2.X和Hadoop3.X的多维度区别详解(博主推荐)
- 【iCore4 双核心板_ARM】例程三十四:U_DISK_IAP_ARM实验——更新升级STM32
- Docker: connection reset by peer
- 域PC脱域
- MySQL的innoDB锁机制以及死锁处理
- Mysql中datetime和timestamp区别
- 0基础浅谈反射型xss (1)
- Navicat for mysql 导出导入的问题
- CUDA Samples: green ball
- Flutter Map<;String, dynamic>; 、List<;String>; a-z 排序
- linux top 命令各参数详解
- ABAP git客户端