android 之 AsyncTask类 学习示例
来源:互联网 发布:手机找不到喊一声软件 编辑:程序博客网 时间:2024/05/20 20:48
<?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() {@Overridepublic 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用到),返回值 类型 @Overrideprotected void onPreExecute() {super.onPreExecute();} //第二个执行方法,onPreExecute()执行完后执行 @Overrideprotected 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 "执行完毕"; } @Overrideprotected void onPostExecute(String result) {//doInBackground返回时触发,换句话说,就是doInBackground执行完后触发 //这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕" setTitle(result); super.onPostExecute(result); }@Overrideprotected void onProgressUpdate(Integer... progress) {//这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数 //但是这里取到的是一个数组,所以要用progesss[0]来取值 //第n个参数就用progress[n]来取值 //jdk1.4 数组,1.5 可变长参数 tv.setText(progress[0]+"%"); super.onProgressUpdate(progress); } @Overrideprotected void onCancelled() {super.onCancelled();} } class GetImageTask extends AsyncTask<String, Void, Bitmap> { InputStream is = null;@Overrideprotected 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;}}@Overrideprotected void onPreExecute() {super.onPreExecute();}@Overrideprotected void onProgressUpdate(Void... values) {super.onProgressUpdate(values);}@Overrideprotected void onPostExecute(Bitmap result) {//setImage(result);super.onPostExecute(result);}@Overrideprotected void onCancelled() {super.onCancelled();} }}