在调用publishProgress(Progress… values)时,此方法被执行,直接将进度信息更新到UI组件上。
(主线程中执行,当后台任务的执行进度发送改变时此方法会被调用).
onPostExecute()方法
当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中, 直接将结果显示到UI组件上。
(异步执行后这个方法被调用)
代码示例(有详细的注释):
package tsou.cn.threadtest;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class AsyncTaskActivity extends AppCompatActivity {
/**
- TextView
*/
private TextView mTextView;
private AsyncTask<String, Integer, StringBuilder> task;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
initData();
initView();
// initExecute();
// initExecuteOnExecutor();
initMyExecute();
}
private void initData() {
progressDialog = new ProgressDialog(AsyncTaskActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMessage(“加载中…”);
}
private void initView() {
mTextView = (TextView) findViewById(R.id.textView);
}
/**
-
默认AsyncTask.SERIAL_EXECUTOR
-
2.3系统同时execute执行10个异步任务
-
3.1版本之前的系统默认最大并发执行5个线程,缓冲线程队列最大128个。虽然开了10个异步任务,
-
但是只能同时并发执行5个,其他的任务都得等前面5个执行完后才继续执行,接着也是5次并发执行。
-
-
3.1版本之后系统,默认是使用SERIAL_EXECUTOR串行任务执行,
-
可以预料到异步任务将会是一个个顺序执行
-
-
一个个线程按加入顺序同步执行的。也就是说,线程池中只有一个核心线程在工作,
-
其他线程都要等之前的线程执行完才能执行
*/
private void initExecute() {
String url = “http://blog.csdn.net/huangxiaoguo1”;
task = new MyAsyncTask().execute(url);
}
/**
-
自定义线程池执行,仅支持3.1以上系统
-
-
使用默认提供的AsyncTask.THREAD_POOL_EXECUTOR线程池
-
-
最大并发执行5个线程,后面的线程都只能等之前5个结束之后再执行
*/
private void initExecuteOnExecutor() {
String url = “http://blog.csdn.net/huangxiaoguo1”;
task = new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url);
}
/**
-
自定义线程池,
-
-
10个核心任务并发执行,而且缓存队列最多能够存储100个任务,
-
当队列满了之后还可以创建10个运行线程
-
-
corePoolSize 核心线程池大小
-
maximumPoolSize 线程池最大容量大小
-
keepAliveTime 线程池空闲时,线程存活的时间
-
TimeUnit 时间单位
-
ThreadFactory 线程工厂
-
BlockingQueue任务队列
-
RejectedExecutionHandler 线程拒绝策略
*/
private void initMyExecute() {
String url = “http://blog.csdn.net/h