Android线程间通信
1.安卓线程间通信的方式有以下几种
1)共享变量(内存)
多个线程共享同一份内存,就是说,一个变量可以同时被多个线程所访问。这里要特别注意同步和原子操作的问题。
2)管道
“管道”是java.io包的一部分。它是Java的特性,而不是Android特有的。一条“管道”为两个线程建立一个单向的通道。生产者负责写数据,消费者负责读取数据。
3)handle机制
一个线程对应一个Looper,一个Looper持有一个MessageQueue,一个Looper可以与多个Handler绑定,一个MessageQueue中可以包含多个Message。
面试被问到android中两个子线程怎通信
构造HandlerThread类的对象mHandlerThread,这样生成一个子线程可以调用new
MyHandler(mHandlerThread.getLooper())来获取子线程的handler,另一个子线程发消息,收到消息的就是子线程而不是主线程了。
android线程间通信的四种实现方式
1,通过Handler机制.
主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递content对象或通过接口调用。另外Handler机制与Activity生命周期不一致的原因,容易导致内存泄漏,不推荐使用。
private void one() {
handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 123:
tv.setText(""+msg.obj);
break;
}
}
};
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Message message=new Message();
message.what=123;
message.obj="通过Handler机制";
handler.sendMessage(message);
}
}.run();
}
2)runOnUiThread方法
用Activity对象的runOnUiThread方法更新,在子线程中通过runOnUiThread()方法更新UI,强烈推荐使用。
privatevoidtwo(){
newThread(){
@Override
publicvoidrun(){
super.run();
for(inti=0;i<3;i++){
try{
sleep(1000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
runOnUiThread(newRunnable() {
@Override
publicvoidrun(){
tv.setText("通过runOnUiThread方法");
}
});
}
}.run();
}
3,View.post(Runnable r)
这种方法更简单,但需要传递要更新的View过去,推荐使用
private void three(){
new Thread(){
@Override
public void run() {
super.run();
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
tv.post(new Runnable() {
@Override
public void run() {
tv.setText("通过View.post(Runnable r) 方法");
}
});
}
}.run();
}
4,AsyncTask
private void four(){
new MyAsyncTask().execute("通过AsyncTask方法");
}
private class MyAsyncTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return objects[0].toString();
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
tv.setText(o.toString());
}
}