Handler概念
Handler允许你发送和处理Message和Runnable object通过关联的一个线程的MessageQueue.
Handler线程间传递消息机制
调用示例1
主函数
myThread = new MyThread();
Message message = mHandler.obtainMessage();
message.what = 1;
mHandler.sendMessage(message);
线程类 MyThread
线程类一创建,就会实例化MyHandler,线程创建后使用start(),线程就启动了吗?
private class MyThread{
public MyThread() {
final HandlerThread thread =
new HandlerThread("myThread",
Thread.MIN_PRIORITY);
thread.start();
mHandler = new MyHandler(thread.getLooper());
}
private class MyHandler extends Handler{
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
try {
Log.i(TAG, "handleMessage: " + msg.what);
String str = URLDecoder.decode(msg.obj.toString(), "UTF-8");
Log.d(TAG, "handleMessage: " + str);
} catch (Exception e) {
Log.e(TAG,e.getMessage());
e.printStackTrace();
}
break;
}
}
}
}
测试结果
2023-04-04 20:31:22.181 28448-32076/cn.jj.restart I/JJWorld: handleMessage: 1
2023-04-04 20:31:22.181 28448-32076/cn.jj.restart E/JJWorld: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
线程间通信 Handler与读写锁对比1
Handler每秒传输120次消息 通过读写锁每秒传输120次消息对比。
RandomStringUtils工具类来自于此库 implementation ‘org.apache.commons:commons-lang3:3.7’
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private MyThread myThread;
private Handler mHandler;
private String TAG = "JJWorld";
private Button button;
private int interval = 0;
private int interval2 = 0;
private ArrayList<String> list = new ArrayList<String>();
private ArrayList<String> list2 = new ArrayList<String>();
private ReentrantReadWriteLock readWriteLock =new ReentrantReadWriteLock();
private Button button2;
private Integer period = 8;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myThread = new MyThread();
Message message = mHandler.obtainMessage();
message.what = 1;
message.obj = 1;
mHandler.sendMessage(message);
initView();
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
private void initView() {
button = (Button) findViewById(R.id.button);
button2 = (Button) findViewById(R.id.button2);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
new Timer()