Android AsyncTask简单讲解用法

看代码吧!注释。。。

 

package com.example.asynctask;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {
    
    private TextView t1 ; // AsyncTask启动时 标识
    private TextView t2 ; // AsyncTask运行时 标识
    private TextView t3 ; // AsyncTask运行完时 标识

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        t1 = (TextView) findViewById(R.id.textView1) ;
        t2 = (TextView) findViewById(R.id.textView2) ;
        t3 = (TextView) findViewById(R.id.textView3) ;
        
        Button btn = (Button) findViewById(R.id.button1) ;
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 点击按钮启动线程,
                // execute传入的参数是泛型的第一个类型值,可多个
                DemoAsyncTask task = new DemoAsyncTask() ;
                task.execute("张小娴") ;
            }
        }) ;
        
    }
    
    // 第一个泛型 启动线程时传入的参数类型
    // 第二个泛型 线程运行时线程运行状态的标识参数类型
    // 第三个泛型 线程运行结束时标识的参数类型
    private class DemoAsyncTask extends AsyncTask<String, String, Long> {

        // 线程的运行主体部分,相当于继承Thread中的run方法
        @Override
        protected Long doInBackground(String... params) {
            // TODO Auto-generated method stub
            
            if(params[0].equals("张小娴")) {
                for (long i = 0; i < 20000; i++) {
            // 调用这个方法更新界面 publishProgress(String.valueOf(i)) ; } }
return (long) 3210; } @Override protected void onCancelled() { // TODO Auto-generated method stub super.onCancelled(); } // 线程启动时最先执行的方法,该方法可以做一些线程运行的准备工作 @Override protected void onPreExecute() { t1.setText("启动了") ; } // 线程运行时,更新界面的一个方法,例如进度条之类的 // 这里不断更新textview中的数字,数字的值是doInBackground方法中的for内部的i值 // 具体看doInBackground方法 @Override protected void onProgressUpdate(String... values) { // TODO Auto-generated method stub t2.setText(values[0]) ; } // 线程执行完成后所做的工作,这里做的是t3 settext为3210, // 这个3210是由doInBackground方法返回的值 // 一般在这个方法中做一些更新界面的操作 @Override protected void onPostExecute(Long result) { t3.setText(String.valueOf(result)) ; // t3.setText("完成") ; } } }

 

要运行起来,只需要在布局文件中添加几个textview和一个button即可。

需要注意的是,AsyncTask只能被主线程启动,不能被子线程启动。

需要被子线程启动的线程,可以直接继承Thread实现,或者实现Runnable接口。

 

 

 

posted on 2013-05-14 01:39  精灵July  阅读(197)  评论(0编辑  收藏  举报

导航