1、Handler内存泄露测试
2、为什么不能在子线程创建Handler
3、textView.setText()只能在主线程执行,这句话是错误!
4、new Handler()两种写法有什么区别?
5、ThreadLocal用法和原理
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Message message;
private Handler handler1 = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
startActivity(new Intent(MainActivity.this, PersonalActivity.class));
return false;
}
});
private Handler handler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText(msg.obj.toString());
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tv);
message = new Message();
test();
}
private void test() {
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(1000);
应用在启动时,会在主线程创建一个Looper ,TheadLocalMap的key是主线程或子线程,其对应的值是Looper, TheadLocalMap的主线程已经对应一个Looper,在子线程中是取不到looper的,所以会抱错;
Toast.makeText(MainActivity.this, "阿里云", Toast.LENGTH_SHORT).show();
}
}).start();
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e("netease >>> ", "onDestroy");
message.recycle();
handler1.removeMessages(3);
handler1 = null;
}
}