在Android中,如果涉及网络编程或者某些极耗资源的操作的时候,必然会出现操作时间久的情况
如果这些都在主线程中进行,那程序将会死在那里(Android有种机制,当程序持续不响应超过规定时间,会提示用户关闭此程序)
所以只能使用非主线程来处理这些操作。
Android提供两种异步机制:
一是使用asynctask类和使用标准线程机制
Asynctask提供一些抽象类的方法,能是用户不用创建线程的情况下管理后台操作。
它提供了一下方法:
obPreExecute() 运行于ui进程,用于进入后台操作前的操作
doInBackGround()运行后台操作
publishProgress()周期性通知UI线程有关后台操作的进度
onPostExecute() 后台操作完成后,调用此方法
非常方便的实现了一个后台进程的周期
使用一般创建线程方法:
使用此方法创建线程,如果要与主线程通信,比较麻烦,要实现消息机制:
handler message looper
通常有两种方式:
第一种:
//使用message public class MyHandler extends Activity { static final String TAG = "Handler"; Handler h = new Handler(){ public void handleMessage (Message msg) { switch(msg.what) { case HANDLER_TEST: Log.d(TAG, "The handler thread id = " + Thread.currentThread().getId() + "\n"); break; } } }; static final int HANDLER_TEST = 1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "The main thread id = " + Thread.currentThread().getId() + "\n"); new myThread().start(); setContentView(R.layout.main); } class myThread extends Thread { public void run() { Message msg = new Message(); msg.what = HANDLER_TEST; h.sendMessage(msg); Log.d(TAG, "The worker thread id = " + Thread.currentThread().getId() + "\n"); } } }
第二种,使用handler post
Handler mHandler = new Handler();//主线程中创建,主线程默认开启就创建Looper,这里就是默认使用了主线程的looper new Thread(){ public void run(){ mHandler.post(new Runnable() { public void run() { //更新主线程的ui } }