android的两种异步机制
16lz
2021-01-23
在android中,如果涉及网络编程或者某些极耗资源的操作的时候,必然会出现操作时间久的情况
如果这些都在主线程中进行,那程序将会死在那里(android有种机制,当程序持续不响应超过规定时间,会提示用户关闭此程序)
所以只能使用非主线程来处理这些操作。
android提供两种异步机制:
一是使用asynctask类和使用标准线程机制
Asynctask提供一些抽象类的方法,能是用户不用创建线程的情况下管理后台操作。
它提供了一下方法:
obPreExecute() 运行于ui进程,用于进入后台操作前的操作
doInBackGround()运行后台操作
publishProgress()周期性通知UI线程有关后台操作的进度
onPostExecute() 后台操作完成后,调用此方法
非常方便的实现了一个后台进程的周期
使用一般创建线程方法:
使用此方法创建线程,如果要与主线程通信,比较麻烦,要实现消息机制:
handler message looper
通常有两种方式:
第一种:
//使用messagepublic 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 }}
更多相关文章
- Android消息机制原理,仿写Handler Looper源码跨线程通信原理--之
- Android UI 线程更新UI也会崩溃???
- android银行卡操作步骤
- Android创建子线程和回调主线程的几种方式
- android 照个图 要开线程 不然永远拍的图都是那么的小
- Android中为什么在子线程不能更新UI
- android手势操作滑动效果触摸屏事件处理、GestureDetector用法