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