随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

在修改UI组件时,之前我一般用开启匿名子线程+Handler来实现的,这种方式效率低,代码看上去也非常臃肿,在这里引入AsyncTask,其特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了匿名线程存在的问题。下面我们用一个简单例子来演示AsyncTask的使用,实现不断更新进度条的进度,代码如下(应朋友们的要求,以后会尽量附上图片,嘻嘻~):
Activity:
package com.home.activity;import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;import com.home.asynctask.R;public class AsyncTaskTestActivity extends Activity implements OnClickListener {private ProgressDialog dialog;private Button progressBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);progressBtn = (Button) findViewById(R.id.main_btn_open_dialog);progressBtn.setOnClickListener(this);}@Overridepublic void onClick(View v) {// 显示对话框,调用此方法后,会回调下面的onCreateDialog方法showDialog(0);}@Overrideprotected Dialog onCreateDialog(int id) {if (id == 0) {// 创建进度对话框dialog = new ProgressDialog(this);// 设置最大进度数dialog.setMax(100);// 设置标题dialog.setTitle("进度对话框");// 设置进度对话框显示的内容dialog.setMessage("正在加载进度");// 设置对话框风格为水平显示进度条dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 显示进度对话框dialog.show();// 启动任务MyTask task = new MyTask();// 执行任务,将会调用MyTask的doInBackground方法task.execute(null);}return super.onCreateDialog(id);}/*** AsyncTask 任务类* * @author Administrator* */public class MyTask extends AsyncTask<String, Integer, Boolean> {// 子线程运行的方法@Overrideprotected Boolean doInBackground(String... params) {for (int i = 0; i <= 100; i++) {// 更新进度条,会回调下面onProgressUpdate方法进行更新publishProgress(i);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}return null;}// 每次调用publishProgress时调用该方法@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);// 设置进度对话框的进度dialog.setProgress(values[0]);}// 当doInBackground方法结束后调用该方法@Overrideprotected void onPostExecute(Boolean result) {super.onPostExecute(result);dialog.setMessage("进度完成");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 把进度条清零dialog.setProgress(0);dialog.cancel();}}}
布局XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><Buttonandroid:id="@+id/main_btn_open_dialog"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="打开对话框" /></LinearLayout>
附上图片: