android 之 AsyncTask类 学习示例

原创 2012年03月26日 16:46:04
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ethan.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


<?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="hello, asyncTask!" />
	<Button 
	    android:id="@+id/download"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="Download"/>
	<TextView 
	    android:id="@+id/tv"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:text="当前进度显示"/>
	<ProgressBar 
	    android:id="@+id/pb"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    style="?android:attr/progressBarStyleHorizontal"/>
	
</LinearLayout>

package com.ethan.activity;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
 * AsyncTask定义了三种泛型类型 Params,Progress和Result。 
Params 启动任务执行的输入参数,比如HTTP请求的URL。 
Progress 后台任务执行的百分比。 
Result 后台执行任务最终返回的结果,比如String。 
子类必须实现抽象方法doInBackground(Params… p) ,
在此方法中实现任务的执行工作,比如连接网络获取数据等。
通常还应该实现onPostExecute(Result r)方法,
因为应用程序关心的结果在此方法中返回。
需要注意的是AsyncTask一定要在主线程中创建实例。 
 * @author ETHAN
 *
 */
public class MainActivity extends Activity {
	private Button download;
	private ProgressBar pb;
	private TextView tv;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        pb = (ProgressBar) findViewById(R.id.pb);
        tv = (TextView) findViewById(R.id.tv);
        
        download = (Button) findViewById(R.id.download);
        
        download.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				DownloadTask task = new DownloadTask();
				
				//对应protected String doInBackground(Integer... params) 
				//params[0] = 100;
				task.execute(100);
			}
		});
    }
    
    class DownloadTask extends AsyncTask<Integer, Integer, String>{
    	//后面尖括号内分别是参数(例子里是线程休息时间),进度(publishProgress用到),返回值 类型  

    	@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}
    	
    	 //第二个执行方法,onPreExecute()执行完后执行  
		@Override
		protected String doInBackground(Integer... params) {
			for(int i=0;i<=100;i++) {
				pb.setProgress(i);
				publishProgress(i);//执行进度
				
				try {
					Thread.sleep(params[0]);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			 return "执行完毕";  
		}  

	

		@Override
		protected void onPostExecute(String result) {
			//doInBackground返回时触发,换句话说,就是doInBackground执行完后触发  
            //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"  
            setTitle(result);  
            super.onPostExecute(result);  
		}

		

		@Override
		protected void onProgressUpdate(Integer... progress) {
			//这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数  
            //但是这里取到的是一个数组,所以要用progesss[0]来取值  
            //第n个参数就用progress[n]来取值  
			//jdk1.4 数组,1.5 可变长参数
            tv.setText(progress[0]+"%");  
            super.onProgressUpdate(progress);  
		}
    	
		@Override
		protected void onCancelled() {
			super.onCancelled();
		}
    }
    
    class GetImageTask extends AsyncTask<String, Void, Bitmap> {
    	InputStream is = null;
		@Override
		protected Bitmap doInBackground(String... params) {
			URL myFileUrl = null;
			Bitmap bitmap = null;
			InputStream is= null;
			HttpURLConnection conn = null;
		
			try {
				myFileUrl = new URL(params[0]);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
			
			try {
				conn = (HttpURLConnection) myFileUrl.openConnection();
				conn.setDoInput(true);
				conn.connect();
				is = conn.getInputStream();
				bitmap = BitmapFactory.decodeStream(is);
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if(is!=null) {
						is.close();
					}
					if(conn!=null) {
						conn.disconnect();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				return bitmap;
			}
		}
		
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}
		@Override
		protected void onProgressUpdate(Void... values) {
			super.onProgressUpdate(values);
		}
		@Override
		protected void onPostExecute(Bitmap result) {
			//setImage(result);
			super.onPostExecute(result);
		}
		@Override
		protected void onCancelled() {
			super.onCancelled();
		}
    }
}




AsyncTask和一个小例子

本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是  继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度...
  • xiangyong_1521
  • xiangyong_1521
  • 2016年01月14日 11:22
  • 714

android异步操作类AsyncTask的使用详解

android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。 AsyncTask的回调逻辑关系  1.主线程调用AsynTa...
  • liuyiming_
  • liuyiming_
  • 2012年04月15日 09:04
  • 5164

Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听

我曾在《Android网络编程之使用HttpClient批量上传文件》一文中介绍过如何通过HttpClient实现多文件上传和服务器的接收。在上一篇主要使用Handler+HttpClient的方式实...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2014年11月03日 19:12
  • 8972

Pro Android学习笔记(九四):AsyncTask(3):ProgressDialog

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/ 小例子 通过简单的菜单,触发一个用sl...
  • flowingflying
  • flowingflying
  • 2014年05月14日 16:11
  • 3113

安卓异步任务类AsyncTask——突出一个简单、好用

前言:AsyncTask是android提供的轻量级异步任务类(代码轻量级,系统资源占用并不是轻量级!),完整的封装了异步任务流程,这让我想起了Handler异步任务通信机制。两者对比起来,Async...
  • JerryCQU
  • JerryCQU
  • 2015年10月23日 09:38
  • 1172

android使用AsyncTask来实现更新进度条

AsyncTask中有三个参数,如class MyTask extends AsyncTask{}   参数1:向后台任务执行过程方法传递参数的类型   参数2:在后台任务执行过程中,要求主UI线...
  • lujianfeiccie2009
  • lujianfeiccie2009
  • 2012年03月06日 23:32
  • 10402

安卓开发——AsyncTask内的各个方法调用顺序

AsyncTask内的各个方法调用顺序:  一、首先,用户调用execute方法,启动AsyncTask 。 二、然后在execute方法中: 1、首先调用onPreExecute方法,执行初...
  • qq_28484355
  • qq_28484355
  • 2016年03月24日 17:01
  • 771

Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新。在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是...
  • jdsjlzx
  • jdsjlzx
  • 2015年02月09日 23:50
  • 6429

AsyncTask异步任务类

AsyncTask异步任务类,比Handle更轻量级,更适合简单的异步操作。内部封装了Handle,在使用AsyncTask类进行刷新控件的刷新操作时,不用再额外创建声明Handle,可以直接使Asy...
  • littlewhitetree
  • littlewhitetree
  • 2016年07月18日 20:49
  • 1076

Android:UI更新方法五:利用AsyncTask更新UI

关于AsyncTask的用法: 主要翻译自:http://developer.android.com/reference/android/os/AsyncTask.html 3个范型参数: Pa...
  • annkie
  • annkie
  • 2013年01月12日 17:14
  • 5694
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 之 AsyncTask类 学习示例
举报原因:
原因补充:

(最多只允许输入30个字)