天天看点

AsyncTask基本使用

AsyncTask的定义:

public abstract class AsyncTask<Params, Progress, Result> 
           

以上三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。

异步任务执行步骤:

1、execute(Params... params):执行任务,一般在onCreate中调用这个方法,就可以开始执行任务

2、onPreExecute():调用了execute(Params... params)后就立即执行,用于在执行耗时任务前对UI进行一些操作,比如可以弹出进度对话框

3、doInBackground(Params... params):在onPreExecute()完成后立即执行,本方法是执行耗时任务的(如:获取网络资源),本方法内不能更新UI

4、onProgressUpdate(Progress... values):在调用了publishProgress(Progress... values)后被执行,本方法可以更新进度条,publishProgress(Progress... values)在doInBackground(Params... params)里面调用

5、onPostExecute(Result result):后台操作结束时,执行此方法,比如关闭进度对话框。

MainActivity.java:

package com.example.demo2;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends Activity {
	private Button execute, cancel;
	private ProgressBar progress_bar;
	private TextView textView;

	private ProgressDialog dialog;
	private MyTask mTask;
	private String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		execute = (Button) findViewById(R.id.execute);
		cancel = (Button) findViewById(R.id.cancel);
		textView = (TextView) findViewById(R.id.textView);
		progress_bar = (ProgressBar) findViewById(R.id.progress_bar);

		execute.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 没次都要new一个实例,新建的任务只能执行一次,否则会出现异常
				mTask = new MyTask();
				mTask.execute("http://www.baidu.com");
				execute.setEnabled(false);
				cancel.setEnabled(true);
			}
		});
		cancel.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 取消一个正在执行的任务,onCancelled将会被调用
				mTask.cancel(true);
			}
		});

	}

	private class MyTask extends AsyncTask<String, Integer, String> {
		// onPreExecute用于执行后台任务前做一些UI操作
		@Override
		protected void onPreExecute() {
			Log.i(TAG, "onPreExecute()");
			textView.setText("加载中...");
			dialog = ProgressDialog.show(MainActivity.this, "提示", "加载中...");
		}

		// doInBackground方法内部执行后台任务(就是执行网络请求等耗时任务),不可在此方法内修改UI
		@Override
		protected String doInBackground(String... arg0) {
			Log.i(TAG, "doInBackground(String... arg0)");
			try {
				HttpClient client = new DefaultHttpClient();
				HttpGet get = new HttpGet(arg0[0]);
				HttpResponse response = client.execute(get);
				if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
					HttpEntity entity = response.getEntity();
					InputStream is = entity.getContent();
					long total = entity.getContentLength();
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
					byte[] buf = new byte[1024];
					int count = 0;
					int length = -1;
					while ((length = is.read(buf)) != -1) {
						baos.write(buf, 0, length);
						count += length;
						// 调用publishProgress公布进度,然后onProgressUpdate方法将被执行
						publishProgress((int) ((count / (float) total) * 100));
						// 为延时进度,休眠500毫秒
						Thread.sleep(500);
					}
					return new String(baos.toByteArray(), "utf-8");
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			return null;
		}

		// onProgressUpdate用于更新进度信息
		@Override
		protected void onProgressUpdate(Integer... values) {
			Log.i(TAG, "onProgressUpdate(Integer... values)");
			progress_bar.setProgress(values[0]);
			textView.setText("loading..." + values[0] + "%");
		}

		// onPostExecute方法用于在执行完后台任务后更新UI,显示结果
		@Override
		protected void onPostExecute(String result) {
			Log.i(TAG, "onPostExecute(String result)");
			dialog.dismiss();
			textView.setText(result);
			execute.setEnabled(true);
			cancel.setEnabled(false);
		}

		// onCancelled方法用于在取消执行中的任务时更新UI
		@Override
		protected void onCancelled() {
			Log.i(TAG, "onCancelled() called");
			textView.setText("任务取消了");
			progress_bar.setProgress(0);

			execute.setEnabled(true);
			cancel.setEnabled(false);
		}

	}

}
           

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/execute"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="执行" />

    <Button
        android:id="@+id/cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="取消" />

    <ProgressBar
        android:id="@+id/progress_bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="0" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </ScrollView>

</LinearLayout>
           

不要忘了添加网络访问权限:

<uses-permission android:name="android.permission.INTERNET"/>
           
AsyncTask基本使用
AsyncTask基本使用