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

一、简介

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

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     >
 7     <TextView
 8         android:id="@+id/textViewId"
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         android:text="AsyncTask"
12     />
13 
14     <ProgressBar 
15         android:id="@+id/progerssBarId"
16         android:layout_width="fill_parent"
17         android:layout_height="wrap_content"
18         style="@android:style/Widget.ProgressBar.Horizontal"
19         android:max="100"/>
20     <Button 
21         android:id="@+id/buttonId"
22         android:layout_width="fill_parent"
23         android:layout_height="wrap_content"
24         android:text="开始异步操作"
25     />
26     <Button 
27         android:id="@+id/printButtonId"
28         android:layout_width="fill_parent"
29         android:layout_height="wrap_content"
30         android:text="打印字符串"
31     />
32 </LinearLayout>

2.java
(1)MainActivity.java

 1 package com.async;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.view.View.OnClickListener;
 7 import android.widget.Button;
 8 import android.widget.ProgressBar;
 9 import android.widget.TextView;
10 
11 public class MainActivity extends Activity {
12 
13     private Button button = null;
14     private Button printButton = null;
15     private ProgressBar progressBar = null;
16     private TextView textView = null;
17     
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         
23         button = (Button)findViewById(R.id.buttonId);
24         printButton = (Button)findViewById(R.id.printButtonId);
25         progressBar = (ProgressBar)findViewById(R.id.progerssBarId);
26         textView = (TextView)findViewById(R.id.textViewId);
27         
28         button.setOnClickListener(new OnClickListener() {
29             @Override
30             public void onClick(View v) {
31                 ProgressBarAsyncTask progressBarAsyncTask = new ProgressBarAsyncTask(textView, progressBar);
32                 //调用AsyncTask的excuet方法会在新线程中执行
33                 progressBarAsyncTask.execute(1000);//参数用来给onPostExecute作测试用
34             }
35         });
36         
37         printButton.setOnClickListener(new OnClickListener() {
38             @Override
39             public void onClick(View v) {
40                 System.out.println("printButton------->");
41             }
42         });
43     }
44 }

(2)ProgressBarAsyncTask.java

 1 package com.async;
 2 
 3 import android.os.AsyncTask;
 4 import android.widget.ProgressBar;
 5 import android.widget.TextView;
 6 
 7 //生成该类的对象,并调用其execute方法之后
 8 //首先执行的的onPreExecute方法
 9 //其次是执行doInBackground方法
10 //AsyncTask<Integer, Integer, String>三个泛形参数的作用为
11 //(1)Integer:指定doInBackground()的参数类型为Integer
12 //(2)Integer:指定onProgressUpdate()的参数类型为Integer
13 //(3)String:指定doInBackground()的返回类型及onPostExecute()的参数类型为String
14 public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {
15 
16     private TextView textView = null;
17     private ProgressBar progressBar = null;
18     
19     public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
20         super();
21         this.textView = textView;
22         this.progressBar = progressBar;
23     }
24 
25     //该方法并不运行在UI线程当中,所以在该方法当中,不能对UI当中的控件进行设置和修改
26     //主要用于进行异步操作。
27     @Override
28     protected String doInBackground(Integer... params) {
29         NetOperator netOperator = new NetOperator();
30         int i = 0;
31         for(i = 10 ; i <= 100 ; i+=10) {
32             netOperator.operate();
33             //用于发布更新消息
34             publishProgress(i);
35         }
36         return i + params[0].intValue() + "";
37     }
38 
39     //该方法运行在UI线程当中,主要用于进行异步操作之前的UI准备工作
40     @Override
41     protected void onPreExecute() {
42         textView.setText("开始执行异步操作");
43     }
44 
45     //在doInBackground方法执行结束之后再运行,并且运行在UI线程当中。
46     //主要用于将异步任务执行的结果展示给客户
47     @Override
48     protected void onPostExecute(String result) {
49         textView.setText("异步操作执行结束" + result);
50     }
51 
52     //在doInBackground方法当中,每次调用publishProgress()方法之后,都会触发该方法
53     //用于在异步任务执行的过程当中,对用户进行提示,例如控制进度条等
54     @Override
55     protected void onProgressUpdate(Integer... values) {
56         int value = values[0];
57         progressBar.setProgress(value);
58     }
59     
60     
61 }

(3)NetOperator.java

 1 package com.async;
 2 
 3 //模拟网络操作
 4 public class NetOperator {
 5 
 6     public void operate() {
 7         try {
 8             Thread.sleep(1000);
 9         } catch (InterruptedException e) {
10             e.printStackTrace();
11         }
12     }
13 }
原文地址:https://www.cnblogs.com/shamgod/p/5204882.html