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