歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android的兩種異步機制

在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 } }

Copyright © Linux教程網 All Rights Reserved