人生主干道只有一条,如同android的主线程,而路上的风景值得欣赏,无论走多远,请记得回家的路。这便是 Thread,Handle和AsycTask
- Thread的使用
Android多线程编程和java多线程编程基本类似,定义一个线程只需新建一个类继承Thread,然后重写run()方法。
1.1:创建自定义的类继承Thread
public class MyThread extends Thread {
private static final String TAG = "MyThread";
@Override
public void run() {
super.run();
Log.i(TAG, "run: MyThread is running");
}
}
调用的时候使用
new MyThread().start();//完成调用
1.2:创建自定义的类实现Runnable
接口
public class MyOtherThread implements Runnable{
private static final String TAG = "MyOtherThread";
@Override
public void run() {
//处理事件的方法
Log.i(TAG, "run: MyOtherThread is running");
}
}
调用的方法
//说明:Thread的调用里面需要传递一个runnable对象,我们的类已经实现了该方法,所以只需要进行传入使用就好
MyOtherThread myOtherThread = new MyOtherThread();
Thread otherThread = new Thread(myOtherThread);
otherThread.start();
Log.i(TAG, "onCreate: otherThread"+otherThread.currentThread().getId()+"***"+otherThread.currentThread().getName());
1.3:使用匿名类直接进行处理
//启动一个子线程,匿名的方法类
new Thread(new Runnable() {
@Override
public void run() {
Log.i(TAG, "run: ThreadRunnable is running");
}
}).start();
以上是多线程编程的基本使用方法,java
也是如此的。
2 . 在子线程中更新UI
Android的UI的线程并不是安全的,也就是说要更新应用的UI元素,必须在主线程中进行,否则会抛出异常。简言之,在子线程中你可以进行逻辑处理,但是涉及到UI的更新操作,你只能在主线程中进行。
2.1:基于上述的原因,在android中使用Thread
的时候都是和Handler
一起结合工作。
public class MainActivity extends AppCompatActivity {
public static final int UPDATE_TEXT = 1;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case UPDATE_TEXT:
textView.setText("update done");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//******************************
}
/**
* 点击按钮之后进行数据处理
*/
public void ButtonOnclick(){
//那么我么在点击之后启动一个子线程来完成数据的更新
/*错误示例*/
/*new Thread(new Runnable() {
@Override
public void run() {
textView.setText("子线程更新Ui");
}
}).start();*/
/*正确示例*/
new Thread(new Runnable() {
@Override
public void run() {
//发送Message对象
Message message = new Message();
message.what = UPDATE_TEXT;
handler.sendMessage(message);
}
}).start();
}
}
以上便是相应的方法,会使用并不是我们的最终目标,下面来说说android异步处理机制
3 . android异步处理机制:(Message/Handler/MessageQueue/Looper)
3.1 :Message 是在线程之间传递的消息,可以在内部携带少量的信息,用于在不同线程之间交换数据。
3.2:MessageQueue 消息队列,主要存放所有通过handler发送的消息
3.3:Looper:相当于MessageQueue的管家,调用Looper.loop()方法后,就会进入一个无限循环的状态,然后每当发现MessageQueue中存在一条消息,就会将其取出,并传递到Handler的handleMessage()方法中
3.4:Handler 处理者
在此附一张图来直观的看看工作原理:声明该图片参考郭霖的书籍《第一行代码》第二版中关于线程讲解一书
4 .AsycTask的使用方法(后面的blog中会在service进行详细讲解并使用)关于service的使用
完。