AsyncTask的简单使用

AsyncTask定义AsyncTask能够使我们更正确和更容易去操作UI Thread,能够使我们在不使用多线程和Handlers的情况下执行后台操作并把执行的结果反馈给UI Thread.

根据AsyncTask的定义有两大显著的好处:1、能够使用AsyncTask异步执行一些耗时的任务,并且能够非常好的和UI  Thread交互   2、避免了因使用多线程带来的性能问题和使用Handlers时的繁琐

我们来认识下AsyncTask主要的几个方法

execute(Params....):执行任务,此方法必须运行在UI Thread中,这一点需要大家格外注意下

onPreExecute():这个方法是Task executed时立刻调用但依然是运行在UI Thread中所以不应执行耗时操作,一般是进行Task常规设置工作

doInBackground(Params...)onPreExecute()方法完成后立刻执行此方法,该方法是在后台线程中执行(background thread),我们可以进行一些耗时的工作,参数是excute(params....)方法传递而来,可以在此方法中更新一些需要实时UI

publishProgress(Params...):我们可以在doInBackground()方法中使用此方法更新UI

onProgressUpdate(Params...):publishProgress(Params...)调用后执行,运行在UI Thread中,可以在此方法中真正进行UI更新

onPostExecute(Result)doInBackground(Params...)方法执行完毕也就是后台线程执行完毕后执行,接收最终执行结果

下面来看一个非常简单的例子

AsyncTaskTestActivity.java


package bing.asyncTask;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;

public class AsyncTaskTestActivity extends Activity {
	
    private View db;
	private TextView showText;
	private ProgressBar pb;

	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        db = findViewById(R.id.db) ;
        
        showText = (TextView)findViewById(R.id.showText) ;
        
        pb = (ProgressBar)findViewById(R.id.pb) ;
        
        db.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				DownloadAt da = new DownloadAt() ;
				da.execute(500) ;
			}
		});
        

    }
    class DownloadAt extends AsyncTask{
    	
	   	@Override
	   	protected void onPreExecute() {
	   		super.onPreExecute();
	   	}
   	
		@Override
		protected Object doInBackground(Object... params) {
			
			for (int i = 0; i <= 100; i++) {
				
				publishProgress(i) ;// 会回调onProgressUpdate方法
				
				try {
					Thread.sleep((Integer)params[0]) ;
				} catch (InterruptedException e) {
					e.printStackTrace();
				} 
				
			}
			
			return getString(R.string.dbcomplete);
		}
   	
		@Override
		protected void onProgressUpdate(Object... values) {
			
			int value = (Integer)values[0];
			showText.setText(value+"%") ;
			pb.setProgress(value) ;
			super.onProgressUpdate(values);
		}
		
		/* (non-Javadoc)
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 * 执行完毕调用的方法
		 */
		@Override
		protected void onPostExecute(Object result) {
			setTitle((String)result) ;
			super.onPostExecute(result);
		}
   }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
	
    <Button 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/db"
        android:text="@string/db"
        />
    
    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/showText"
        android:text="@string/showText"
        />
    <ProgressBar 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/pb"
        style="?android:attr/progressBarStyleHorizontal"
        />
</LinearLayout>

执行结果截图


AsyncTask可以非常方便的执行一些耗时的操作,能够方便的更新UI,当我们要进行一些耗时的操作时可以优先选用AsyncTask,比如图片加载......



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值