Android除了能用java的Thread创建异步任务
android还提供了以下异步工具
1.AsyncTask。在后工作了,可以自定义发给主线程状态,完成时把结果发给主线程。
2.HandlerThread。是android提供的带消息循环的Thread。
// 创建对象,并启动该线程
HandlerThread mHandlerThread = new HandlerThread("sub_thread");
mHandlerThread.start();
// 一定要传刚创建的线程的Looper,要不然handlermessage不再子线程中执行
Handler mHandler = new Handler(mHandlerThread.getLooper());
3.自定义带消息循环的Thread(就是在run函数中加Looper.prepare();Looper.loop();在这两个被调中间定义handler。退出消息循环用 Looper.myLooper().quit())
new AsyncTask<Integer, Integer, Integer>() { protected void onPreExecute() { Log.i(TAG, "异步子线程开始前"); } @Override protected Integer doInBackground(Integer... params) { Log.i(TAG, "doInBackground 传参:" + params[0]); for (int i = 0; i < 10; i++) { publishProgress(i); } return 2; } protected void onProgressUpdate(Integer... values) { Log.i(TAG, "doInBackground 更新进度为:" + values[0]); } protected void onPostExecute(Integer result) { Log.i(TAG, "doInBackground 返回结果为:" + result); } }.execute(1);
class LooperThread extends Thread { private Handler mHandler; private final Object mSync = new Object(); public void run() { Looper.prepare(); //加锁是为了 getHandler()不为空,必须的 synchronized (mSync) { mHandler = new Handler(){ @Override public void handleMessage(Message msg) { Log.d("CYQ", "--->" + msg); } }; mSync.notifyAll(); } Looper.loop(); } public Handler getHandler() { synchronized (mSync) { if (mHandler == null) { try { mSync.wait(); } catch (InterruptedException e) { } } return mHandler; } } public void exit() { getHandler().post(new Runnable(){ public void run() { Looper.myLooper().quit(); }}); } }