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();
		}
    }
}




相关文章推荐

android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

首先原谅我把文章的标题写的这么长。其实我还嫌弃它短了因为 写不下去了所以我就不写了。因为我实在不知道该怎么定义这篇文章的标题或许应该叫 “乱谈”比较合适。 这样可能还体现了 大道至简的 精髓 呵呵。 ...

android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

原文链接:android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版 首先原谅我把文章的标题写的这么长。...

Android中AsyncTask的介绍,示例和原理分析

默认情况下,在一个相同的android应用程序当中,其里面的组件都是运行在同一个线程里面的,这个线程我们称之为main thread,当我们通过某个组件来启动另一个组件的时候,这个时候默认是在同一个线...

Android中AsyncTask的用法示例

AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主...

Android AsyncTask的使用介绍与示例

我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴...

【Android基础】AsyncTask示例——加载网络图片

网络操作是一个严重的耗时操作,所以从Android 4.0版本开始,网络操作就被严禁放在主线程中,所以网络操作只能放在异步任务中。下面是一个从网络上下载图片的示例,示例分为两个部分: - 异步处理下...

android 使用asynctask结合fragment更新UI(另附线程池管理示例)

使用asynctask结合fragment更新UI。在android上有不少设计都是使用fragment,因为使用fragment的生命周期可以和activity一起管理,再受到横竖屏旋转也可以保持稳...

深入学习Android异步任务-AsyncTask

一、AsyncTask的介绍与使用AsyncTask可以让程序进行异步工作,它在一个线程中执行某些操作,之后将结果返回给UI线程。使用AsyncTask类时,需要继承AsyncTask类并实现doIn...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android 之 AsyncTask类 学习示例
举报原因:
原因补充:

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