关闭

android 之 AsyncTask类 学习示例

993人阅读 评论(0) 收藏 举报
<?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();
		}
    }
}




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:629112次
    • 积分:7217
    • 等级:
    • 排名:第3215名
    • 原创:183篇
    • 转载:80篇
    • 译文:0篇
    • 评论:123条
    文章分类
    最新评论