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