zoukankan      html  css  js  c++  java
  • Android简易实战教程--第三十三话《 AsyncTask异步倒计时》

    本篇小案例,完成一个倒计时。方式选择AsyncTask。代码贴在下面:

    布局文件soeasy:

    <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:orientation="vertical">
    
        <TextView
            android:id="@+id/tv"
            android:textSize="18sp"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="32dp" />
        <Button 
            android:text="开始任务"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="start"/>
    
    </LinearLayout>

    接着活动代码:


    package com.example.asynctask;
    
    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.SystemClock;
    import android.view.View;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
    	private TextView tv;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		tv = (TextView) findViewById(R.id.tv);
    	}
    
    	public void start(View v) {
    		//@1:对应的参数是:1、doInBackground回调中的传入的参数类型;2、执行任务的参数类型
    		//@2:进度参数,与进度有关。onProgressUpdate的参数类型
    		//@3:1、doInBackground的返回值类型;2、执行结果onPostExecute传入的参数类型
    		new AsyncTask<Integer, Integer, Integer>() {
    			
    			@Override
    			protected void onPreExecute() {
    				// 准备执行前调用,用于界面初始化操作
    				
    			}
    			
    			@Override
    			protected Integer doInBackground(Integer... params) {
    				// 子线程,耗时操作
    				int start = params[0];
    				int end = params[1];
    				
    				int result = 0;
    				for (int i = end; i >= start; i--) {
    					SystemClock.sleep(20);
    					result = i;
    					publishProgress(result);//把进度推出去,推给onProgressUpdate参数位置
    				}
    				return result;
    			}
    			
    			@Override
    			protected void onProgressUpdate(Integer[] values) {
    				//主线程执行的回调,可更新进度。values为doInBackground调用publishProgress时候推过来的参数。这里每次推一个。因此数组长度就是0
    				int progress = values[0];
    				tv.setText(progress+"");
    			};
    			
    			@Override
    			protected void onPostExecute(Integer result) {
    				// 执行完成的回调,即获得数据后的回调
    				tv.setText(result+"");
    			}
    			
    		}.execute(0,100);
    	}
    }
    

    对于AsyncTask的详细分析,请关注《Android进阶》专栏介绍。上面的代码注释也很清晰,运行看看效果:

    欢迎关注本博客,不定期推送简单有趣的小文哦。

  • 相关阅读:
    LINUX安装NGINX
    CentOS 设置mysql的远程访问
    centos6 mysql 安装与配置
    php读取用友u8采购入库单列表及详细
    php读取用友u8客户档案
    深度linux没有ll等命令的解决办法
    CentOS7下FTP的安装与配置
    虚拟机CentOS6.5搭建samba服务器实现文件共享
    linux 查找php.ini在那个文件夹
    CBE引擎概览
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299568.html
Copyright © 2011-2022 走看看