1.主线程里面不能执行耗时的任务,耗时任务都是在子线程里面执行的。
a.开启子线程前,做一些界面初始化的操作。(弹出对话框,在界面上提示用户正在更新,正在获取数据等)
b.开启子线程,在后台执行一个耗时的任务。
c.当后台的任务执行完毕后,发送一个消息,通过主线程更新界面(关闭对话框,弹出吐司,隐藏加载布局等)
2.代码实现
a.定义抽象类
import android.app.Activity;
import android.os.Handler;
public abstract class MyAsyncTask extends Activity {
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 后台任务执行完了.
onPostExecute();
};
};
public void doSomeThing() {
onPreExecute();
new Thread() {
public void run() {
doInBackgroud();
handler.sendEmptyMessage(0);
};
}.start();
}
/**
* 后台执行的任务 在子线程中执行
*/
public abstract void doInBackgroud();
/**
* 后台任务执行之前的操作,运行在主线程里面的\
*/
public abstract void onPreExecute();
/**
* 后台任务执行后的操作,运行在主线程
*/
public abstract void onPostExecute();
}
b.继承抽象类
package cn.itcast.asynctask;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
public class DemoActivity extends MyAsyncTask {
private ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
doSomeThing();
}
@Override
public void doInBackgroud() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onPreExecute() {
pd = new ProgressDialog(this);
pd.setMessage("我在执行耗时的操作");
pd.show();
}
@Override
public void onPostExecute() {
pd.dismiss();
Toast.makeText(this, "执行完毕", 0).show();
}
}