zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    区块链简单模拟的一些资料
    解析配置文件的一段练习代码
    go语言字符串练习
    20180613更新 leetcode刷题
    啊哈 算法 中 图相关算法
    paxos 练手 推进中
    传智播客8月C/C++基础班开班
    虚拟机最佳实践:单个 VM、临时存储和已上传磁盘
    在微软平台上运行 SAP 应用程序
    了解 Windows Azure 存储的可伸缩性、可用性、持久性和计费
  • 原文地址:https://www.cnblogs.com/shamgod/p/5204882.html
Copyright © 2011-2022 走看看