• android中asynctask的使用实例


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

    MainActivity.java

     1 import android.support.v7.app.AppCompatActivity;
     2 import android.os.Bundle;
     3 import android.view.View;
     4 import android.widget.Button;
     5 import android.widget.ProgressBar;
     6 import android.widget.TextView;
     7 
     8 public class MainActivity extends AppCompatActivity {
     9 
    10     @Override
    11     protected void onCreate(Bundle savedInstanceState) {
    12         super.onCreate(savedInstanceState);
    13         setContentView(R.layout.activity_main);
    14 
    15         Button button = (Button)findViewById(R.id.button_downLoad);
    16         final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar);
    17         final TextView textView = (TextView) findViewById(R.id.textView_hello);
    18         final ProgressBar progressBar2 = (ProgressBar)findViewById(R.id.progressBar2);
    19 
    20         button.setOnClickListener(new View.OnClickListener() {
    21             @Override
    22             public void onClick(View v) {
    23                 ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar, progressBar2);//传进去需要改变的控件
    24                 asyncTask.execute(55);//传入初始参数(这里表示将从55开始计数)
    25             }
    26         });
    27 
    28     }
    29 }

    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
     1 package com.turtle920.tread;
     2 
     3 import android.os.AsyncTask;
     4 import android.widget.ProgressBar;
     5 import android.widget.TextView;
     6 
     7 public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> {
     8     /*Params 启动任务执行的输入参数,比如HTTP请求的URL。由主线程中的asyncTask.execute(55);传入
     9     Progress 后台任务执行的百分比。
    10     Result 后台执行任务最终返回的结果,比如String。*/
    11     private TextView textView;
    12     private ProgressBar progressBar;
    13     private  ProgressBar progressBar2;
    14 
    15 
    16     public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar, ProgressBar progressBar2) {
    17         super();
    18         this.textView = textView;
    19         this.progressBar = progressBar;
    20         this.progressBar2 = progressBar2;
    21     }
    22 
    23     /**
    24      * 这里的Integer参数对应AsyncTask中的第一个参数
    25      * 这里的String返回值对应AsyncTask的第三个参数
    26      * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改
    27      * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作
    28      */
    29     @Override
    30     protected String doInBackground(Integer... params) {//...表示可以传若干参数
    31         NetOperator netOperator = new NetOperator();
    32         int i = params[0];//由主线程中的asyncTask.execute(55);传入
    33         for (i = params[0]; i <= 100; i+=1) {
    34             netOperator.operator();
    35             publishProgress(i, 100-i);//传两个参数给onProgressUpdate
    36         }
    37         return "" + i + " " + params[0].intValue() + "****";//传参数给onPostExecute
    38     }
    39 
    40     /**
    41      *该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
    42      */
    43     @Override
    44     protected void onPreExecute() {
    45         textView.setText("开始执行异步线程");
    46     }
    47 
    48     /**
    49      * 这里的Intege参数对应AsyncTask中的第二个参数
    50      * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
    51      * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
    52      */
    53     @Override
    54     protected void onProgressUpdate(Integer... values) {//参数来自publishProgress()
    55         int value = values[0];
    56         int value1 = values[1];
    57         progressBar.setProgress(value);
    58         progressBar2.setProgress(value1);
    59         textView.setText(""+value+"% "+value1);
    60     }
    61 
    62     /**
    63      * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)
    64      * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
    65      */
    66     @Override
    67     protected void onPostExecute(String result) {//参数来自doInBackground() return
    68         textView.setText("异步操作执行结束" + result);
    69     }
    70 
    71 
    72 }
    NetOperator.java
     1 package com.turtle920.tread;
     2 
     3 //模拟网络环境
     4 public class NetOperator {
     5 
     6     public void operator(){
     7         try {
     8             //休眠
     9             Thread.sleep(10);
    10         } catch (InterruptedException e) {
    11             // TODO Auto-generated catch block
    12             e.printStackTrace();
    13         }
    14     }
    15 
    16 }
    
    
  • 相关阅读:
    Docker 基础 B站 学习 最强 教程
    apache+php安装
    php拓展 swoole 安装
    go beego框架 入门使用 (一)
    php 使用 phpword 操作 word 读取 word
    linux + MongoDB 安装 + 部署 + 讲解 (满满干货看完记得收藏噢)
    Thanos设计简析
    Prometheus TSDB文件格式-index
    Linux Kernel文件系统写I/O流程代码分析(二)bdi_writeback
    Linux Kernel文件系统写I/O流程代码分析(一)
  • 原文地址:https://www.cnblogs.com/turtle920/p/4901713.html
Copyright © 2020-2023  润新知