在Android程序开始运行的时候会单独启动一个进程,默认情况下所有这个程序操作都在这个进程中进行。一个Android程序默认情况下只有一个进程,但是一个进程却是可以有许线程的。
在这些线程中,有一个线程叫做UI线程,也叫做Main Thread,除了Main Thread之外的线程都可称为Worker Thread。Main Thread主要负责控制UI页面的显示、更新、交互等。因此所有在UI线程中的操作要求越短越好,只有这样用户才会觉得操作比较流畅。一个比较好的做法是把一些比较耗时的操作,例如网络请求、数据库操作、复杂计算等逻辑都封装到单独的线程,这样就可以避免阻塞主线程。
所以,一个Android程序,一个进程
、一个UI线程,多个子线程
、UI线程负责UI,子线程负责耗时的网络操作
实现线程的方法:
1.扩展Thread类
//内部类的方式实现
new Thread(){
public void run() {
System.out.println("Thread02");
};
}.start();
2.实现Runnable接口
//内部类的方式实现
Runnable run = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run01");
}
};
Thread b = new Thread(run);
b.start();
3.使用异步类AsnyncTask
/**
* Params 启动任务执行的输入参数,比如HTTP请求的URL。
* Progress 后台任务执行的百分比。
* Result 后台执行任务最终返回的结果,比如String,Integer等。
* @author Administrator
*/
class FriendsAsyncTask extends AsyncTask<String, Integer, String> {
/*
* 为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
* 1)Task的实例必须在UI线程中创建
* 2)execute方法必须在UI线程中调用
* 3)不要手动的调用onPreExecute(),
* onPostExecute(Result),doInBackground(Params...),
* onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
* 4)该task只能被执行一次,否则多次调用时将会出现异常
*
*/
/**
* 该方法将在执行实际的后台操作前被UI线程调用。 可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
/**
* 这里的String参数对应AsyncTask中的第一个参数 这里的String返回值对应AsyncTask的第三个参数
* 该方法并不运行在UI线程当中,主要用于异步操作,所以在该方法中不能对UI当中的控件进行设置和修改
* 该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。
*/
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
return null;
}
// 在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
// 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI
// 线程,并且在界面上展示给用户.
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
}
// 在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
}
}
FriendsAsyncTask task = new FriendsAsyncTask();
task. execute(params);//这里的params对应doInBackground中的params
子线程和UI线程通信
Handler 机制
new Thread() {
public void run() {
Message msg = new Message();
Object result = "flag01";//网络耗时操作
msg.obj = result;
msg.what = thread01;
information.sendMessage(msg);
};
}.start();
//*********************
private final int thread01 = 1;
private final int thread02 = 2;
//*********************
private Handler information = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case thread01:
System.out.println("thread01"+msg.obj);
break;
case thread02:
System.out.println("thread02"+msg.obj);
break;
default:
break;
}
}
};
参考
http://blog.csdn.net/boyupeng/article/details/6208072
http://www.open-open.com/lib/view/open1434802647364.html
http://blog.csdn.net/boyupeng/article/details/49001215
http://blog.csdn.net/harvic880925/article/details/24774883
网友评论