Android多线程编
为了不影响用户对软件的正常使用,我们需要将在应用的一些耗时 的操作方在一些子线程中去执行。
线程的基本用法
class MyThread extends Thread{
public void run(){
//具体的处理逻辑
}
}
使用它:
new MyTread().start();
为了降低耦合性,我们通常是这样使用它的:
class MyThread implement Runnable{
public void run(){
//具体的处理逻辑
}
}
更好的使用它:
MyThread myThread = new MyThread();
new myTread (myTreads).start();
使用匿名内部类的方式;
new Thraed(new Runnable(){
public void run(){
//具体的处理逻辑
}
}).strat();
Android 不允许子线程去更新UI
我们创建一个Handler对象对UI进行操作
public static final int UPDATE_TEXT = 1;
Handler handler = new Handler(){
public void handlerMessage(Message msg){
swith(msg.what){
case UPDATE_TEXT:
//进行UI更新操作
}
}
new Thraed(new Runnable(){
public void run(){
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
Handler 异步消息处理机制:
1.Message 线程之间传递的消息:message.what(),measge.arg1()和message.arg2().//携带一些整型数据message.obj()//携带object对象。
2.Handler 处理者。sendMessage()方法发送消息,handleMessage()接受消息。
3.MessageQueue 消息队列。存放所有通过Handler发送的消息,等待处理。每个线程中只会有一个MessageQueue对象。
4.Looper 每个线程中MessageQueue的管家。调用Looper的Loop()方法后,进入无线循环,发现MessageQueue中有消息,就会将它取出,并传递给Handler的handeMessage中。每个线程只会有一个Looper。
AsyncTask的使用:
这是一Android帮我们封装好的用于在子线程中对UI进行操作的工具。其背后的实现原理是基于异步消息处理机制。
由于AsyncTask是一个抽象类,所以当我们使用它的时,要创建一个子类去继承它。
class MyAsyncTask entends AnyscTask<第一个泛型参数,第二个泛型参数,第三个泛型参数>{}
class myAsynctask extends AsyncTask<Void,Integer,Boolean>{ //任务开始之前执行,比如初始化控件。 @Override protected void onPreExecute() { super.onPreExecute(); } //进行后台任务处理,完成主要的子线程任务,进行耗时操作 @Override protected Boolean doInBackground(Void... voids) { //调用该方法启动 onProgressUpdate方法进行UI更新操作 publishProgress(); return null; } //进行UI操作 @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } //doInBackground()方法结束调用,进行后续操作。比如进行任务完成提示,关闭控件等。 @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); } }
启动该任务的方法:
new MyAsyncTask().execute();