1. 程式人生 > >Android Handler機制

Android Handler機制

1.Handler機制

為了避免ANR,我們會通常把耗時操作放在子執行緒裡面進行,因為子執行緒不能更新UI,所以當子執行緒需要更新UI的時候就需要藉助到安卓的訊息機制,也就是Handler機制。

2.作用

避免ANR,程式掛了,崩潰了。

造成ANR原因:1.在Activity中超過五秒的時間未能響應的下一個事件。2.BroadcastReceive超過10未響應。

避免ANR:1.主執行緒不能執行耗時操作。2.子執行緒不能直接更新UI介面。

如何手動製造ANR:

public class MainActivity extends AppCompatActivity {
    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = findViewById(R.id.button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    Thread.sleep(300000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

    }

}

3.Handler的簡單應用

public class MainActivity extends AppCompatActivity {
    private Button mButton;
    private Handler mHandler;

    @SuppressLint("HandlerLeak")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = findViewById(R.id.button);
        //new 一個Handler物件,複寫handleMessage方法
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what) {
                    case 1:
                        mButton.setText("1");
                        break;
                    case 2:
                        mButton.setText("2");
                        break;
                }

            }
        };

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //兩種傳遞方式
                Message msg = Message.obtain();
                msg.what = 1;
                mHandler.sendMessage(msg);

                mHandler.sendEmptyMessage(2);
            }
        });

    }

}
原理請關注:http://www.jianshu.com/p/9e4d1fab0f36