Android Handler 原理分析

Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题
今天就为大家详细剖析下Handler的原理
Handler使用的原因
1.多线程更新Ui会导致UI界面错乱
2.如果加锁会导致性能下降
3.只在主线程去更新UI,轮询处理
Handler使用简介
其实关键方法就2个一个sendMessage,用来接收消息
另一个是handleMessage,用来处理接收到的消息
下面是我参考疯狂android讲义,写的一个子线程和主线程之间相互通信的demo
对原demo做了一定修改
public class MainActivity extends AppCompatActivity {
public final static String UPPER_NUM="upper_num";
private EditText editText;
public jisuanThread jisuan;
public Handler mainhandler;
private TextView textView;
class jisuanThread extends Thread{
public Handler mhandler;
@Override
public void run() {
Looper.prepare();
final ArrayList al=new ArrayList<>();
mhandler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==0x123){
Bundle bundle=msg.getData();
int up=bundle.getInt(UPPER_NUM);
outer:
for(int i=3;i<=up;i++){
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
continue outer;
}
}
al.add(i);
}
Message message=new Message();
message.what=0x124;
Bundle bundle1=new Bundle();
bundle1.putIntegerArrayList("Result",al);
message.setData(bundle1);
mainhandler.sendMessage(message);
}
}
};
Looper.loop();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText= (EditText) findViewById(R.id.et_num);
textView= (TextView) findViewById(R.id.tv_show);
jisuan=new jisuanThread();
jisuan.start();
mainhandler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==0x124){
Bundle bundle=new Bundle();
bundle=msg.getData();
ArrayList al=bundle.getIntegerArrayList("Result");
textView.setText(al.toString());
}
}
};
findViewById(R.id.bt_jisuan).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message=new Message();
message.what=0x123;
Bundle bundle=new Bundle();
bundle.putInt(UPPER_NUM, Integer.parseInt(editText.getText().toString()));
message.setData(bundle);
jisuan.mhandler.sendMessage(message);
}
});
}
}