Handler机制
小白一个,记录历程
Handler的简单使用
使用handler发送消息,只需要两步,首先是创建一个Handler对象,并重写handleMessage方法,然后需要消息通信的地方,通过Handler的sendMessage方法发送消息(这里我们创建了一个子线程,模拟子线程向主线程发送消息)。 下面展示一些 内联代码片 。
// A code block
var foo = 'bar';
```import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private static final int SEND_MESSAGE = 1;
private Button button;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.sendMessage);
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case SEND_MESSAGE :
Toast.makeText(MainActivity.this,"I get handler message",Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"I send Message",Toast.LENGTH_SHORT).show();
Message msg = Message.obtain();
msg.what = SEND_MESSAGE;
mHandler.sendMessage(msg);
}
});
}
}
```javascript
// An highlighted block
var foo = 'bar';
这样就完成子线程向主线程发送消息,那么,如果想要主线程向子线程发送消息呢?是否也只要在子线程中创建Handler对象,然后在主线程中拿到子线程的Handler以后,调用sendMessage发送消息。在onCreate中添加如下代码: 下面展示一些 内联代码片 。
// A code block
var foo = 'bar';
// 创建一个子线程,并在子线程中创建一个Handler,且重写handleMessage
new Thread(new Runnable() {
@Override
public void run() {
subHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 处理消息
switch (msg.what) {
case MSG_MAIN_TO_SUB:
Log.e(TAG, "接收到消息: " + Thread.currentThread().getName() + ","+ msg.obj);
break;
default:
break;
}
}
};
}
}).start();
btnSendToSubThread = (Button) findViewById(R.id.btn_sendto_subthread);
btnSendToSubThread.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message msg = Message.obtain();
msg.what = MSG_MAIN_TO_SUB;
msg.obj = "这是一个来自主线程的消息";
// 主线程中发送消息
subHandler.sendMessage(msg);
}
});
var foo = 'bar';
我们点击按钮时,发现并没有成功,并且报出了如下的错误信息:
原因得很清楚,不能在一个没有调用Looper.prepare()的线程去创建Handler对象。那为什么主线程我们不需要去手动调用Looper.prepare()就可以直接使用Handler呢?原来是启动App时,系统帮我们创建好了。 看样子,创建Handler还是需要调用Looper.prepare的,我们平常在主线程不需要手动调用,是因为系统在启动App时,就帮我们调用了。并且还需要调用Looper.loop方法,这个方法后面我们会讲到。所以使用Handler通信之前需要有以下三步: (1)调用Looper.prepare() (2)创建Handler对象 (3)调用Looper.loop() 那按照这个套路,我们完善下之前的代码,其实就是在子线程中创建Handler之前调用Looper.prepare(),之后调用Looper.loop()方法,如下: 下面展示一些 内联代码片 。
// A code block
var foo = 'bar';
import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast;
public class MainActivity extends AppCompatActivity { private static final int SEND_MESSAGE = 1; private Button button; private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.sendMessage);
// mHandler = new Handler(){ // @Override // public void handleMessage(Message msg) { // super.handleMessage(msg); // switch (msg.what){ // case SEND_MESSAGE : // Toast.makeText(MainActivity.this,“I get handler message”,Toast.LENGTH_LONG).show(); // break; // default: // break; // } // } // };
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message msg = Message.obtain();
msg.what = SEND_MESSAGE;
mHandler.sendMessage(msg);
}
});
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case SEND_MESSAGE :
Toast.makeText(MainActivity.this,"I get handler message",Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
Looper.loop();
}
}).start();
}
}
var foo = 'bar';
Handler机制原理
|