ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作

时间:2021-04-17 15:14:26

一、简介

ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作

二、代码
1.xml
(1)activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/textViewId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="AsyncTask"
/> <ProgressBar
android:id="@+id/progerssBarId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.ProgressBar.Horizontal"
android:max="100"/>
<Button
android:id="@+id/buttonId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="开始异步操作"
/>
<Button
android:id="@+id/printButtonId"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="打印字符串"
/>
</LinearLayout>

2.java
(1)MainActivity.java

 package com.async;

 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView; public class MainActivity extends Activity { private Button button = null;
private Button printButton = null;
private ProgressBar progressBar = null;
private TextView textView = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); button = (Button)findViewById(R.id.buttonId);
printButton = (Button)findViewById(R.id.printButtonId);
progressBar = (ProgressBar)findViewById(R.id.progerssBarId);
textView = (TextView)findViewById(R.id.textViewId); button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ProgressBarAsyncTask progressBarAsyncTask = new ProgressBarAsyncTask(textView, progressBar);
//调用AsyncTask的excuet方法会在新线程中执行
progressBarAsyncTask.execute(1000);//参数用来给onPostExecute作测试用
}
}); printButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("printButton------->");
}
});
}
}

(2)ProgressBarAsyncTask.java

 package com.async;

 import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView; //生成该类的对象,并调用其execute方法之后
//首先执行的的onPreExecute方法
//其次是执行doInBackground方法
//AsyncTask<Integer, Integer, String>三个泛形参数的作用为
//(1)Integer:指定doInBackground()的参数类型为Integer
//(2)Integer:指定onProgressUpdate()的参数类型为Integer
//(3)String:指定doInBackground()的返回类型及onPostExecute()的参数类型为String
public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> { private TextView textView = null;
private ProgressBar progressBar = null; public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
super();
this.textView = textView;
this.progressBar = progressBar;
} //该方法并不运行在UI线程当中,所以在该方法当中,不能对UI当中的控件进行设置和修改
//主要用于进行异步操作。
@Override
protected String doInBackground(Integer... params) {
NetOperator netOperator = new NetOperator();
int i = 0;
for(i = 10 ; i <= 100 ; i+=10) {
netOperator.operate();
//用于发布更新消息
publishProgress(i);
}
return i + params[0].intValue() + "";
} //该方法运行在UI线程当中,主要用于进行异步操作之前的UI准备工作
@Override
protected void onPreExecute() {
textView.setText("开始执行异步操作");
} //在doInBackground方法执行结束之后再运行,并且运行在UI线程当中。
//主要用于将异步任务执行的结果展示给客户
@Override
protected void onPostExecute(String result) {
textView.setText("异步操作执行结束" + result);
} //在doInBackground方法当中,每次调用publishProgress()方法之后,都会触发该方法
//用于在异步任务执行的过程当中,对用户进行提示,例如控制进度条等
@Override
protected void onProgressUpdate(Integer... values) {
int value = values[0];
progressBar.setProgress(value);
} }

(3)NetOperator.java

 package com.async;

 //模拟网络操作
public class NetOperator { public void operate() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}