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